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

2つのテーブルを比較して、片方のテーブルにしかない
データを検索したいのですが、どのようなSQL文に
なるのか 教えて下さい。
下記の例だと、AテーブルとBテーブルの両方にあるデータ以外のデータを検索したいので、下記の結果になります。よろしくお願いします

期待される結果
003 さああ
004 いいい
005 ううう


Aテーブル
001 あいう
002 えおお 
003 さああ
004 いいい
005 ううう

Bテーブル
001 あいう
002 えおお 

A 回答 (9件)

No8ですが、


> EXCEPT を使用する次のクエリは、EXCEPT オペランドの左辺のクエリから返され、右辺のクエリからは返されなかった、重複しない値が返されます。
なので、これでは不十分だと思います。
逆も必要なので、Unionして

select * from Aテーブル
except
select * from Bテーブル
Union
select * from Bテーブル
except
select * from Aテーブル

#あ。なるほど。EXCEPTはOracleのMinus互換の命令か…。
    • good
    • 0

http://msdn2.microsoft.com/ja-jp/library/ms18805 …

select * from Aテーブル
except
select * from Bテーブル;
    • good
    • 0

失礼しました。

質問文をよく読めていませんでした。

001~005といった値が入った列の名前を、IDとします。
「あいう」といった値が入った列の名前を、STRとします。

前半のSELECT文は、AにありBにないもの、後半の
SELECT文では、BにありAにないものを取り出します。

SELECT * FROM A
WHERE NOT EXISTS(SELECT * FROM B
WHERE ID=A.ID AND STR=B.STR)
UNION
SELECT * FROM B
WHERE NOT EXISTS(SELECT * FROM A
WHERE ID=A.ID AND STR=B.STR)

IDだけで一意に行を識別できるなら、STR列に対する
条件は不要です。
    • good
    • 0

Bテーブルだけに存在しAテーブルには存在しないデータを、どうやってJOIN/UNIONなしで表示するんでしょうね(笑)



サンプルデータでしか動作しないSQL書いてもしょうがない。
    • good
    • 0

この質問の回答で、JOINやUNIONが出てくるのが不思議です。


001~005といった値が入った列の名前を、IDとします。
「あいう」といった値が入った列の名前を、STRとします。

SELECT * FROM A
WHERE NOT EXISTS(SELECT * FROM B
WHERE ID=A.ID AND STR=B.STR)

IDだけで一意に行を識別できるなら、STR列に対する
条件は不要です。
    • good
    • 0

手元に環境がないので記憶だけで。


確か、minusはSQLSERVERにはなかった記憶があります。
で、多分Full Outer Joinでいけるはずです。
#2,3のSQL文に比べて、多少複雑になりますが、処理は速い…はずです。

Select
isNull(A.ID,B.ID) ,
isNull(A.Name,B.Name)
From A
FULL OUTER JOIN B
On A.ID =B.ID
Where A.ID Is Null
Or B.ID Is Null
-----------
ちなみに
Select *
From A
FULL OUTER JOIN B
On A.ID =B.ID
を流せばFULL OUTER JOINがどういうものかは分かると思います。(まあBooks Onlineにもサンプルはあるはずなんですが)
    • good
    • 0

ID/文字列の組が、AテーブルでもBテーブルでも同じ(同じIDには必ず同じ文字列が対応する)であれば



SELECT ID, STR
  FROM A
  WHERE ID NOT IN (
    SELECT ID FROM B
  )
UNION
SELECT ID, STR
  FROM B
  WHERE ID NOT IN (
    SELECT ID FROM A
  )

で。

同じIDでも対応する文字列が同じとは限らない場合は

SELECT ID,STR
  FROM A
  WHERE NOT EXISTS (
    SELECT * FROM B WHERE ID = A.ID AND STR = A.STR
  )
UNION
SELECT ID,STR
  FROM B
  WHERE NOT EXISTS (
    SELECT * FROM A WHERE ID = B.ID AND STR = B.STR
  )

で。

(全角空白でインデントしてあるので、そのままでは実行できません。)
    • good
    • 0

select * from A where A.num+A.chr not in


(select B.num+B.chr from B where A.num = B.num and A.chr = B.chr)
でどうかな。
比べる項目は場合によってはCONCATでそろえたりしてください。
    • good
    • 0

同じ型のテーブルならminusが使えるかと思います。


select * from ・・・ minus select * ・・・
(構文がSQLServerで使えるかは調べてないですが。)
だめなら、
select num, ss from tableA where num not in (select num from tableB)
とか
not exists文に直せばいけるかと。
    • good
    • 0

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

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