どのように私は、関連付けられていないレコードを見つけたSQL文を作ることができますか?

StackOverflow https://stackoverflow.com/questions/2490839

  •  21-09-2019
  •  | 
  •  

質問

次のように私は2つのテーブルを持っています:

tblCountry (countryID, countryCode)

tblProjectCountry(ProjectID, countryID)
tblCountryテーブルは、そのコードを持つすべての国のリストであるとtblProjectCountryテーブルは、特定のプロジェクトで特定の国を関連付けます。私は私にtblProjectCountryテーブル内の関連レコードを持っていない彼らの国コードと国のリストを与えるSQL文を必要とします。これまでのところ、私はここに着います:

SELECT     tblCountry.countryID, tblCountry.countryCode
FROM         tblProjectCountry INNER JOIN
                      tblCountry ON tblProjectCountry.countryID = tblCountry.countryID
WHERE     (SELECT     COUNT(ProjectID)
                         FROM         tblProjectCountry 
                         WHERE     (ProjectID = 1) AND (countryID = tblCountry.countryID)) = 0

上記の文の正しいとしてパースが、私が探している正確な結果を与えるものではありません。缶誰ヘルプ?

役に立ちましたか?

解決

この仕事をしていますか?

SELECT countryID, countryCode 
  FROM tblCountry 
  WHERE countryID NOT IN ( SELECT countryID FROM tblProjectCountry )

他のヒント

別の方法:

SELECT outerTbl.countryID, outerTbl.countryCode 
    FROM tblCountry AS outerTbl
    WHERE NOT EXISTS 
        (
            SELECT countryID FROM tblProjectCountry WHERE countryID = outerTbl.countryID
        )

相関サブクエリする

と呼ばれるものをこの用途 私もを利用することを

注キーワードも参照する

上のSQL Serverは、NOT一般れるEXISTS <のhref = "http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null- SQLサーバ/」のrel = "nofollowをnoreferrerは">よりパフォーマンスのことを思いました。他のRDMSでのあなた走行距離はに異なる場合があります。

関連付けられていないレコードを検索するには、少なくとも、2つの方法があります。

1。使用LEFT JOIN

SELECT DISTINCT -- each country only once
  tblCountry.countryID,
  tblCountry.tblCountry 
FROM
  tblCountry 
  LEFT JOIN
    tblProjectCountry
  ON
    tblProjectCountry.countryID = tblCountry.countryID
WHERE
  tblProjectCountry.ProjectID IS NULL -- get only records with no pair in projects table
ORDER BY
  tblCountry.countryID

erikkallen に言及し、これは のうまくない実行することができます。

として、

2。使用NOT EXISTS

NOT EXISTS又はINを使用して様々なバージョンは rohancragg と他によって提案された

SELECT
  tblCountry.countryID,
  tblCountry.tblCountry 
FROM
  tblCountry 
WHERE
  -- get only records with no pair in projects table
  NOT EXISTS (SELECT TOP 1 1 FROM tblProjectCountry WHERE tblProjectCountry.countryID = tblCountry.countryID) 
ORDER BY
  tblCountry.countryID

は、両方のバージョンがより良い実行することができ、あなたのDBMSと国とのプロジェクトテーブルのサイズによって異なります。

MS SQL 2005の私のテストでは〜250個の国や〜5000 のプロジェクトの持つテーブルの最初と2番目のクエリの間に有意差はなかったです。しかし、3Mを超えるとテーブル(NOT EXISTSを使用して)のプロジェクトの第二版ではるかに優れ、多くを行っています。

だから、いつものように、両方のバージョンをチェックすることの価値ます。

SELECT ... WHERE ID NOT IN(SELECT ...)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top