こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

SQL文を教えて下さい

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

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


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

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

投稿日時 - 2005-10-25 13:54:06

QNo.1734844

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

13人が「このQ&Aが役に立った」と投票しています

回答(9)

ANo.9

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

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

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

投稿日時 - 2007-01-19 08:07:44

ANo.8

http://msdn2.microsoft.com/ja-jp/library/ms188055.aspx

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

投稿日時 - 2007-01-18 11:32:28

ANo.7

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

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列に対する
条件は不要です。

投稿日時 - 2005-10-30 17:27:54

ANo.6

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

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

投稿日時 - 2005-10-30 13:41:14

ANo.5

この質問の回答で、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列に対する
条件は不要です。

投稿日時 - 2005-10-30 06:24:13

ANo.4

手元に環境がないので記憶だけで。
確か、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にもサンプルはあるはずなんですが)

投稿日時 - 2005-10-26 06:36:14

ANo.3

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
  )

で。

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

投稿日時 - 2005-10-25 18:21:44

ANo.2

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でそろえたりしてください。

投稿日時 - 2005-10-25 14:58:23

ANo.1

同じ型のテーブルならminusが使えるかと思います。
select * from ・・・ minus select * ・・・
(構文がSQLServerで使えるかは調べてないですが。)
だめなら、
select num, ss from tableA where num not in (select num from tableB)
とか
not exists文に直せばいけるかと。

投稿日時 - 2005-10-25 14:02:48

あなたにオススメの質問