アプリ版:「スタンプのみでお礼する」機能のリリースについて

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です。

質問者からの補足コメント

  • テーブルBは、過去の取引履歴みたいなもので、取引日とその時の単価という感じです。同じ商品に対する重複データが存在します。
    抽出の基準は特にありませんが、とにかく1データのみを対象にしたいのです。
    もし、処理するのに特定のキーが必要であれば、ユニークキーの最小値を選択するということでもOKです。

      補足日時:2016/08/26 10:51

A 回答 (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
    • good
    • 4
この回答へのお礼

ありがとうございました。
正しく処理できました。

お礼日時:2016/08/30 02:13

ではテーブル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;
    • good
    • 1
この回答へのお礼

ありがとうございました。
確認するのが遅くなってしまいましたが、正しく処理できました。

お礼日時:2016/08/30 02:13

で、商品1は何を根拠に単価=100、日付8/10を選んだの?


たとえば単価が高い・安い、日付が速い・遅いなどロジックが必要
同一値だった場合の抽出根拠も

本当に適当よいのであれば100-8/11や110-8/10などクロスしたデータになってもよいの?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A