2009-06-09 2 views
0


問題がどこにあるのか理解してもらえますか? p_Services = 200000000000115のレコードがない
SQLでINを使用する際の問題

SELECT mz_t_Services.p_ID from mz_t_Services 

上記のスクリプトはidを持つレコードが= 200000000000115が
存在するレコードセットを返します。存在する場合

SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec 

上記のスクリプトは、レコードセットを返しますが、このクエリにはレコードを返しません

SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec) 

私はMSSQLを使用しています
EDIT:
p_IDとp_Servicesの両方のデータ型ara bigint

+0

「SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec」とは何ですか? – razzed

+0

あなたのデータベースはどのようになっていますか? mz_t_NaznExec.p_Servicesはmz_t_Services.p_IDの外部キーですか? – jao

+4

...テーブル名を夢見てくれたのは誰ですか? –

答えて

4

mz_t_NaznExec.p_ServicesにはNULLがありますか?結果セットにNULLが1つでもあると、 "NOT IN"は常に失敗します。

+0

Yess、ありがとう、たくさんのRBarry! –

+0

今私は "in"の代わりに常に左(外部)結合を使用する別の正当な理由があります:) – VVS

+0

ここで良い議論があります:http://stackoverflow.com/questions/129077/sql-not-in -constraint-and-null-values –

1
SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT ISNULL(mz_t_NaznExec.p_Services,0) FROM mz_t_NaznExec) 

またはより良い

SELECT mz_t_Services.p_ID from mz_t_Services where mz_t_Services.p_ID not in(SELECT mz_t_NaznExec.p_Services FROM mz_t_NaznExec WHERE mz_t_NaznExec.p_Services is not null) 
+0

ありがとうございましたjonelf!私はまだ問題を修正した –

0

また、これは動作します:

SELECT p_id 
    FROM mz_t_services 
WHERE NOT EXISTS 
     (SELECT 1 
      FROM mz_t_naznexec 
      WHERE mz_t_naznexec.p_services = mz_t_services.p_id 
     ) 

私はそれがより確実に(私の経験で)インデックスを使用しているため、上記の解決策にそれを好みます。これは、nullが存在するかどうかにかかわらず、テーブルの内容の期待にかかわらず常にそのフォームを使用することができます。なぜなら、そうでない列でnullをチェックする理由を尋ねる人々を心配する必要はありません。それらを許可する。

いずれの場合でも、両方のソリューションを試して、どちらが適切かを確認する必要があります。

関連する問題