
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で特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
inner joinをすると数がおかしくなります
MySQL
-
GROUP BYを行った後に結合したい。
Oracle
-
4
SQL 重複しないJoinの仕方を教えてください
MySQL
-
5
[MySQL] 3つのテーブルの結合で重複を消す方法(GROUP BYの使い方)
MySQL
-
6
2つのテーブルから条件に一致しないデータ抽出
SQL Server
-
7
Select文で結合した時に、重複カラムが存在するのでテーブル名を先頭
MySQL
-
8
[SQL]重複内容を持つデータから1件抽出かつ複数のカラムを表示したい
その他(データベース)
-
9
【SQL】他テーブルに含まれる値に合致する行を抽出
その他(データベース)
-
10
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
11
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
12
テーブルに主キーを作らないデメリットは?
その他(Microsoft Office)
-
13
MAX値を条件にデータを取得するには?
SQL Server
-
14
重複していないレコードの抽出方法について
MySQL
-
15
<SQL>重複しているデータの場合は最新の日時のものを取得したい
SQL Server
-
16
2つの項目が重複するレコードを抽出する方法はありますか?
MySQL
-
17
SQL文の結合(一対多)がわからない
その他(データベース)
-
18
一部のカラムでdistinctし全てのカラムを取得
MySQL
-
19
LEFT JOINが2つあるSQL文でANDの意味
MySQL
-
20
結合したテーブルをSUMしたい
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
人気Q&Aランキング
-
4
select文のwhere句に配列を入れ...
-
5
VIEWの元のテーブルのindexって...
-
6
副問合せの書き方について
-
7
”photo id” とは何ぞや?
-
8
同一テーブルの同一フィールド...
-
9
SQL Left Join で重複を排除す...
-
10
[MySQL] 3つのテーブルの結合で...
-
11
別テーブルからSELECTした値を...
-
12
複数テーブルのGROUP BY の使い...
-
13
バインド変数について
-
14
キー毎の、ある列のmaxのレコー...
-
15
inner joinをすると数がおかし...
-
16
存在しないレコードの抽出方法...
-
17
【Transact-sql】 execの結果を...
-
18
WHERE id = ? について
-
19
SELECT文で片方のテーブルを優...
-
20
DB設計について
おすすめ情報
公式facebook
公式twitter
テーブルBは、過去の取引履歴みたいなもので、取引日とその時の単価という感じです。同じ商品に対する重複データが存在します。
抽出の基準は特にありませんが、とにかく1データのみを対象にしたいのです。
もし、処理するのに特定のキーが必要であれば、ユニークキーの最小値を選択するということでもOKです。