0

T2 のレコードにリンクされていない T1 のすべてのレコードを返すクエリがあります。

SELECT DISTINCT fldID, fldValue FROM T1 
 WHERE NOT EXISTS
 (
  SELECT  T1.fldID, T1.fldValue
    FROM T2
    JOIN T1  ON T2.fldID = T1.fldPtr
 )      

しかし、それは空のセットを返します -- 1 つのレコードである必要があります。

このようなクエリを使用する場合 (1 つのフィールドに対する節):

SELECT DISTINCT fldID FROM T1 
 WHERE fldID NOT IN
 (
  SELECT  T1.fldID
    FROM T2
   JOIN T1  ON T2.fldID = T1.fldPtr
 )      

正しい結果を返します。

ただし、SQL Server は構文をサポートしていません

WHERE ( fldID, flrValue ) NOT IN .... 

複数の列をチェックするクエリを作成する方法を教えてください。

ありがとう!

4

9 に答える 9

5

これにも使用できますEXCEPT

SELECT DISTINCT fldID, fldValue FROM T1 

EXCEPT

SELECT  T1.fldID, T1.fldValue
FROM T2
    JOIN T1  ON T2.fldID = T1.fldPtr
于 2013-10-10T08:18:52.620 に答える
2

すべてのデータベースで機能する、より効率的で洗練されたクエリは次のとおりです。

SELECT T1.*
FROM T1
LEFT JOIN T2
    ON T2.fldID = T1.fldPtr
    AND T2.flrValue = T1.flrValue
WHERE T2.fldID IS NULL

LEFT JOIN は両方の基準を使用して一致を試み、次に WHERE 句が結合をフィルター処理し、非結合のみが LEFT JOINed テーブルの NULL 値を持ちます。

このアプローチは、不一致を見つけるためのほぼ業界標準です。通常、NOT EXISTS() よりも効率的ですが、いくつかのデータベースは NOT EXISTS() をこのクエリに最適化します。

于 2013-10-10T08:21:41.813 に答える
1

サブクエリ結合の場合は、これらの両方の列を使用します。

SELECT DISTINCT fldID, fldValue FROM T1 
WHERE NOT EXISTS
(
    SELECT * 
    FROM T2
    JOIN T1 ON T2.fldID = T1.fldPtr
           AND T1.fldValue = T2.flrValue 
)   
于 2013-10-10T08:18:04.360 に答える
0

次のようなものです(あなたの質問を100%理解しているかどうかわからないので):

SELECT DISTINCT fldID FROM T1 
 WHERE fldID NOT IN
 (
  SELECT  T1.fldID
    FROM T2
   JOIN T1  ON T2.fldID = T1.fldPtr
  WHERE T2.flrValue = T1.flrValue
 )  
于 2013-10-10T08:18:09.227 に答える
0

(私のコメントから:) サブクエリで t1 を再度参照する必要はありません。これを行うと、 、または... のselect all the records from t1 that don't exist in t1 ...ように、常に空であるフォームのロジックが発生します。最初のクエリは次のようになります。select all blue balls that are not blueselect all odd numbers that are even

SELECT DISTINCT fldID, fldValue
FROM T1 
WHERE NOT EXISTS (
  SELECT * FROM T2
   WHERE T2.fldID = T1.fldPtr
 );

And: 元のクエリでは、サブクエリは無相関です:t1サブクエリはメイン クエリを隠し、サブクエリt1はメイン クエリからテーブルやエイリアスを参照しません: True(一部の行が存在する) またはFalseのいずれかを返します。結果は次のとおりです。メインクエリの行とはまったく相関していません。(クエリで実際のテーブル名の代わりにエイリアスを使用するもう1つの正当な理由)

于 2013-10-10T11:47:01.730 に答える
0

これはより簡単なクエリです。T2 のレコードにリンクされていないすべての T1.fldID を返します。

SELECT DISTINCT T1.fldID
FROM T1
LEFT JOIN T2 ON T2.fldID = T1.fldPtr
WHERE T2.fldID IS NULL
于 2013-10-10T08:28:06.517 に答える
0

IN を使用して多数の値を除外すると、パフォーマンスが低下します。次のことを試してください。

SELECT T1.*
FROM T1
    LEFT JOIN T2 ON T2.fldID = T1.fldPtr AND T1.fldValue = T2.fldvalue
WHERE T2.fldID IS NULL
于 2013-10-10T08:29:54.540 に答える