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.1
- 回答日時:
で、商品1は何を根拠に単価=100、日付8/10を選んだの?
たとえば単価が高い・安い、日付が速い・遅いなどロジックが必要
同一値だった場合の抽出根拠も
本当に適当よいのであれば100-8/11や110-8/10などクロスしたデータになってもよいの?
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.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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PostgreSQL PostgreSQL レコードからアイテム種類数を取得したい 2 2022/11/23 22:31
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- その他(データベース) pythonでsqlight勉強中、クエリー結果の利用法教えて下さい 1 2022/04/28 20:38
- SQL Server SQLのクエリの書き方 1 2022/03/29 23:06
- その他(データベース) accessについて 2 2022/05/31 16:58
- Excel(エクセル) エクセルでのVBA 2 2022/08/03 06:48
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- Excel(エクセル) Excel 関数 vlookupなどの使い方について質問です。 シート1に品番、商品名、単価、発注条 6 2022/06/15 19:16
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- Visual Basic(VBA) 【ExcelVBA】Powerクエリーでいうピボット解除と同じ処理をVBAで 4 2022/07/06 17:09
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
inner joinをすると数がおかしくなります
MySQL
-
SQL 重複しないJoinの仕方を教えてください
MySQL
-
-
4
GROUP BYを行った後に結合したい。
Oracle
-
5
SQLで特定の項目の重複のみを排除した全項目を取得する方法
その他(プログラミング・Web制作)
-
6
[MySQL] 3つのテーブルの結合で重複を消す方法(GROUP BYの使い方)
MySQL
-
7
結合したテーブルをSUMしたい
MySQL
-
8
group byの並び順を変えるだけで結果が異なる
Oracle
-
9
LEFT JOIN と GROUP BY
MySQL
-
10
SELECT INTOで一度に複数の変数へ代入をするにはどのようにすれがよいでしょうか?
PostgreSQL
-
11
2つのテーブルから条件に一致しないデータ抽出
SQL Server
-
12
<SQL>重複しているデータの場合は最新の日時のものを取得したい
SQL Server
-
13
複数テーブルのGROUP BY の使い方を教えて下さい。
MySQL
-
14
count関数の値をwhere句で使用する方法について
MySQL
-
15
集計後の数値が倍になる
Oracle
-
16
一部のカラムでdistinctし全てのカラムを取得
MySQL
-
17
SQL文のwhere条件文で使う <> の意味はなんですか
その他(データベース)
-
18
2つの列が同じ値の行を取得するSQL
Oracle
-
19
テーブルの列数を調べたい
MySQL
-
20
データがあれば○○なければのSQL
その他(プログラミング・Web制作)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
[MySQL] UNIQUE制約の値を更新...
-
select文のwhere句に配列を入れ...
-
SQLにて特定の文字を除いた検索...
-
selectした大量データをinsert...
-
エクセルの関数について教えて...
-
sqlで、600行あるテーブルを100...
-
MySQLのint型で001と表示する方...
-
VIEWの元のテーブルのindexって...
-
複数テーブルのGROUP BY の使い...
-
Unionした最後にGROUP BYを追加...
-
Access パラメータクエリをcsv...
-
LAST_INSERT_IDで同時にアクセ...
-
PL/SQLの変数について
-
[SQLServer] テーブル名からカ...
-
VMwareがCDドライブを認識する...
-
1対多結合で多を絞り込み条件と...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
VIEWの元のテーブルのindexって...
-
select文のwhere句に配列を入れ...
-
selectした大量データをinsert...
-
センノシド異性体構造式
-
Unionした最後にGROUP BYを追加...
-
insertを高速化させたい
-
SQLにて特定の文字を除いた検索...
-
マイクラPC版のコマンドで効率...
-
ある条件の最大値+1を初番する...
-
inner joinをすると数がおかし...
-
sqlで、600行あるテーブルを100...
-
エクセルの関数について教えて...
-
Access パラメータクエリをcsv...
-
URL と行番号の指定
-
複数テーブルのGROUP BY の使い...
-
PL/SQLの変数について
おすすめ情報
テーブルBは、過去の取引履歴みたいなもので、取引日とその時の単価という感じです。同じ商品に対する重複データが存在します。
抽出の基準は特にありませんが、とにかく1データのみを対象にしたいのです。
もし、処理するのに特定のキーが必要であれば、ユニークキーの最小値を選択するということでもOKです。