2016-04-30 9 views
0

私はSQLクエリに少し問題があります: 'TableB'のIDを含む 'TableA.b'フィールドを持つ 'TableA'があります。私は任意のフィールド 'TableA.b'に等しいIDを持っていない 'TableB'からすべての行を選択したいと思います。言い換えれば、私はテーブルのすべての行がTableAからフィールドで参照されていないことが必要です。 私はこのようなクエリを試みた:MySQL - フィールドが等しくない行を選択する

SELECT DISTINCT TableB.* FROM TableA, TableB Where TableA.b != TableB.ID 

をしかし、結果は、両方のフィールドが同じ値を持っている、すなわち否定、によって返される行を含んでいます。 アイデア

+0

投稿された回答はどれですか? – e4c5

答えて

1

必要なものはLEFT (or RIGHT) JOINです。

SELECT TableB.* FROM TableA 
    LEFT JOIN TableB on TableA.b = TableB.ID 
    WHERE TableA.b IS NULL 

それはotehr答えのいくつかのようにサブクエリで同じことを行うことは可能ですが。結合はしばしばfasterになります。 サーバはより良いだけではMySQLサーバに固有ではない であるという事実を、それを最適化することができるかもしれないので、

A LEFT [OUTER] JOINのは、同等のサブクエリより高速になります。 SQL-92以前では、外部結合には が存在しなかったため、サブクエリが特定の処理を行う唯一の方法でした。今日、 MySQLサーバと他の多くの最新のデータベースシステムでは、幅広い外部結合タイプの が提供されています。

0

あなたは、この

SELECT TableB.* FROM TableB 
    WHERE ID NOT IN 
     (SELECT b from TableA); 
0

ファーストを試してみてくださいTableAからすべてのIDを選択することができます。

SELECT DISTINCT b FROM TableA 

そして、存在しないIDを持っていることTableB内のすべての行を選択するために、その結​​果を使用上記のクエリをサブクエリとして使用して、このセットで次のようにします。

SELECT * FROM TableB WHERE ID NOT IN (SELECT DISTINCT b FROM TableA) 

希望します。

0

SELECTクエリでNOT INを使用してください。

SELECT * FROM TableB t1 WHERE t1.ID NOT IN (SELECT t2.b FROM TableA t2); 
+0

これは解決策かもしれませんが、内部選択結果にNULLが含まれていると空の結果が出ているようです。 – user1563232

+0

'@ user1563232'はできません。 Inner空または行数を選択します。上記のクエリでNULLを使用することはできません。テーブルBのデータをtableAで内部結合または左結合する必要がない場合は、 – Vijay

+0

を使用します。 – Vijay

0

右結合も使用できます。 試してみてください:

SELECT DISTINCT TableB.* FROM tablea RIGHT JOIN TableB ON TableA.b = Tableb.ID WHERE TableA.B IS NULL 
関連する問題