SQLでLEFT JOINキーワードがあります。これって大雑把に言うと、SELECT文では条件に一致するものと、左の表しかないものと2通り抽出します。

今欲しい条件文は、条件に合わずに左の表しかないもの「だけ」を抽出したいのですが、どうしたらできるでしょうか??
明日仕事で使うので、分かる方助けてください!良い回答には100P!!
サイトの紹介でも、簡単なSQL文で構成を示してもらっても構いません。

回答の条件
  • 1人2回まで
  • 登録:2007/01/23 23:00:26
  • 終了:2007/01/30 23:05:02

回答(4件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012007/01/23 23:07:21

ポイント27pt

連結されるほうのテーブルの中のフィールドが『Nullならば選択しない』というような書き方になります。

SELECT T1.*

FROM T1 LEFT JOIN T2 ON T1.a = T2.a

WHERE T2.a Is Null;

id:keronimo

おおっ シンプルで分かりやすいです。

それほど知識がありませんが、これでいけると思います。早速使わせていただきます!

2007/01/23 23:50:00
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/01/23 23:58:59

ポイント27pt

http://www.postgresql.jp/document/pg821doc/html/functions-subque...

そういう場合は JOIN では無く、NOT EXISTS か NOT IN を使います。

id:keronimo

説明文が難しいですね。

上記の方のように例文を示していただけるとありがたいのですが・・

2007/01/24 00:14:04
id:huruyosi No.3

huruyosi回答回数30ベストアンサー獲得回数32007/01/24 00:53:29

ポイント26pt

SELECT T1.*

FROM T1 LEFT JOIN T2 ON T1.a = T2.a

WHERE T2.a Is Null;

を例にして T1にだけにあり、T2には無い

Existsで書くなら

SELECT T1.*

FROM T1

WHERE NOT EXISTS(

SELECT *

FROM T2

WHERE T1.a = T2.a AND T2.a IS NOT NULL

)


NOT IN で書くなら

SELECT T1.*

FROM T1

WHERE I1.a not in ( SELECT T2.a FROM T2 WHERE T2.a is not null)

id:keronimo

1の方の回答が一番シンプルに見えますが、なぜ一般的ではないのか?この回答も求めます。

2007/01/24 07:15:05

質問者が未読の回答一覧

 回答者回答受取ベストアンサー回答時間
1 huruyosi 30 27 3 2007-01-24 08:31:17
  • id:kn1967
    >なぜ一般的ではないのか?

    技術屋さんとしては『テーブルのレコードを返そうとするLEFT JOIN』よりも『レコードの有無だけを返すNOT EXISTS』のほうが動作が速いのでそちらをチョイスするべきと言うかもしれませんが、実際にどれだけ違うのかという事になると大差なかったりもしますので、どちらも一般的に使われてます。

    明日必要というキーワードもありましたので、シンプルな改造で済む方法として1/のような回答をさせていただきましたが、Existsも書いておくという丁寧さや配慮がかけていたと申されましたら返す言葉はございません。
  • id:b-wind
    LEFT JOIN vs NOT EXISTS というよりもDBによって NOT NULL 検索でインデックスが使えないことが問題。
    実際にどちらが早いかはさまざまな条件にもよるので試してみないとわからない。

    個人的には結合してるのに結合した部分を使わないという処理が分かり難いとも思うが。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません