
Left Joinで左側のテーブルをもとに右側のテーブルを連結したいのですが、右側のテーブルに重複データが存在します。そこで、重複してしいる右側のデータの任意の一つだけを結合したいのですが、どのようにしたらよいでしょうか?
例えば以下の様な内容です。
テーブルA
商品 数量
-----------------------
商品1 10
商品2 20
商品3 30
テーブルB
商品 単価 日付
-----------------------
商品1 100 8/10
商品1 110 8/11
商品3 200 8/12
これらのテーブルを結合して以下のようなデータを取得したいのですが、同のようなSQL文を作成したらよいのでしょうか?
検索結果
商品 数量 単価 日付
-----------------------
商品1 10 100 8/10
商品2 20 NULL NULL
商品3 30 200 8/12
商品1はテーブルBに重複したデータがありますが、いずれか一つを選択できればOKです。
商品2はテーブルBにデータがありませんので、単価と日付はNULLでOKです。
No.3ベストアンサー
- 回答日時:
SQLSERVERということであれば、LEFT JOINの代わりにOUTER APPLYを使ってクエリを簡単にする手もあります。
速度はデータにもよりますが、LEFT JOINより早いようですね。
相対コスト(LEFT JOIN 82:OUTER APPLY 18)
DECLARE @TA TABLE (id INT NOT NULL PRIMARY KEY,item VARCHAR(30),quantity INT)
INSERT INTO @TA VALUES(1,'商品1',10),(2,'商品2',20),(3,'商品3',30)
DECLARE @TB TABLE (id INT NOT NULL PRIMARY KEY,item VARCHAR(30),price INT,saledate DATE)
INSERT INTO @TB VALUES(100,'商品1',100,'2016-08-10'),(101,'商品1',110,'2016-08-11'),(102,'商品3',200,'2016-08-12')
SELECT TA.item,TA.quantity,TB.price,TB.saledate FROM @TA as TA
OUTER APPLY(
SELECT TOP 1 * FROM @TB as TB
WHERE TA.item = TB.item
ORDER BY TB.id
) as TB
No.2
- 回答日時:
ではテーブルA、テーブルBに主キーが別途設定されているという前提で
//基本データ
CREATE TABLE TA(id INT NOT NULL PRIMARY KEY,item VARCHAR(30),quantity INT);
INSERT INTO TA VALUES(1,'商品1',10),(2,'商品2',20),(3,'商品3',30);
CREATE TABLE TB(id INT NOT NULL PRIMARY KEY,item VARCHAR(30),price INT,saledate DATE);
INSERT INTO TB VALUES(100,'商品1',100,'2016-08-10'),(101,'商品1',110,'2016-08-11'),(102,'商品3',200,'2016-08-12');
//表示
SELECT TA.item,TA.quantity,TD.price,TD.saledate FROM TA
LEFT JOIN (
SELECT TB.item,TB.price,TB.saledate FROM TB
INNER JOIN (
SELECT item,MIN(id) AS min_id FROM TB GROUP BY item
) AS TC
ON TB.id=TC.min_id
) AS TD
ON TA.item=TD.item;
No.1
- 回答日時:
で、商品1は何を根拠に単価=100、日付8/10を選んだの?
たとえば単価が高い・安い、日付が速い・遅いなどロジックが必要
同一値だった場合の抽出根拠も
本当に適当よいのであれば100-8/11や110-8/10などクロスしたデータになってもよいの?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
SQL 重複しないJoinの仕方を教えてください
MySQL
-
GROUP BYを行った後に結合したい。
Oracle
-
[MySQL] 3つのテーブルの結合で重複を消す方法(GROUP BYの使い方)
MySQL
-
-
4
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
5
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
6
一部のカラムでdistinctし全てのカラムを取得
MySQL
-
7
CASE文のエラーについて
Oracle
-
8
2つのテーブルから条件に一致しないデータ抽出
SQL Server
-
9
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
10
UNIONする際、片方テーブルしかないカラムも利用
MySQL
-
11
Winmerge ファイルの中身は同じなのに黄色くなる
その他(OS)
-
12
EXCEL VBAで全選択範囲の解除
Excel(エクセル)
-
13
型 varchar から型 numeric への変換エラー。
その他(データベース)
-
14
SQL文で、合計が0のレコードを表示させないようにしたい。
SQL Server
-
15
異なるスキーマからデータを抽出するには?oracl、PL/SQL
Oracle
-
16
IFで条件を分岐させてのINSERT(ストアド)。
SQL Server
-
17
テーブルに存在しない列をselect文で出力する事はできないでしょうか?
PostgreSQL
-
18
SELECT 文の NULL列は?
PostgreSQL
-
19
SQLServer2005のSQL文での別名の取り扱い
SQL Server
-
20
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数について教えて...
-
SQL Left Join で重複を排除す...
-
マイクラPC版のコマンドで効率...
-
updateを1行ずつ実行したい。
-
selectで拾ってきたデータをも...
-
埼玉県の中央部の方!!
-
inner joinをすると数がおかし...
-
ローカルルーターモードとは
-
DB設計について
-
エクセルで最後の文字だけ置き...
-
イケメンにチーズバーガーをぶ...
-
MySQLで半角濁音文字の検索
-
入力値と外部キーをINSERTするには
-
URL と行番号の指定
-
Access VBAでのIDの自動発番
-
SQLの検索について
-
Mysql UPDATE出来ません
-
差し込み後、元データを変更し...
-
列番号による項目の取得について
-
noの後の語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
エラー 1068 (42000): 複数の主...
-
SQLサーバから、項目の属性(型...
-
select文のwhere句に配列を入れ...
-
SQL Left Join で重複を排除す...
-
Access パラメータクエリをcsv...
-
マイクラPC版のコマンドで効率...
-
【Transact-sql】 execの結果を...
-
sqlで、600行あるテーブルを100...
-
SQLにて特定の文字を除いた検索...
-
1テーブル&複数レコードの更新...
-
PL/SQLの変数について
-
WordpressのContact form 7でzi...
-
複数テーブルのGROUP BY の使い...
-
バインド変数について
-
inner joinをすると数がおかし...
-
MySQLのint型で001と表示する方...
-
updateを1行ずつ実行したい。
おすすめ情報
テーブルBは、過去の取引履歴みたいなもので、取引日とその時の単価という感じです。同じ商品に対する重複データが存在します。
抽出の基準は特にありませんが、とにかく1データのみを対象にしたいのです。
もし、処理するのに特定のキーが必要であれば、ユニークキーの最小値を選択するということでもOKです。