どのように私は、関連付けられていないレコードを見つけたSQL文を作ることができますか?
-
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 ...)