3

次のように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

上記のステートメントは正しいものとして解析されますが、探している正確な結果は得られません。誰でも助けることができますか?

4

4 に答える 4

3

これは機能しますか?

SELECT countryID, countryCode 
  FROM tblCountry 
  WHERE countryID NOT IN ( SELECT countryID FROM tblProjectCountry )
于 2010-03-22T08:49:03.487 に答える
3

別の方法:

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

これは、相関サブクエリと呼ばれるものを使用します

EXISTS キーワードも使用していることに注意してください(も参照) 。

SQL Server では、一般に NOT EXISTSの方がパフォーマンスが高いと考えられています。他の RDMS では、走行距離が異なる場合があります

于 2010-03-22T09:01:24.747 に答える
1

関連付けられていないレコードを見つけるには、少なくとも 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

erikallenが述べたように、これはうまく機能しない可能性があります。

2.使用NOT EXISTS

NOT EXISTSorを使用するさまざまなバージョンは、 rohancraggなどINによって提案されました。

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 番目のクエリに大きな違いはありませんでした。ただし、300 万を超えるプロジェクトのテーブルでは、 2 番目のバージョン (を使用NOT EXISTS) の方がはるかに優れたパフォーマンスを示しました。

いつものように、両方のバージョンをチェックする価値があります。

于 2010-03-22T08:50:26.777 に答える
0

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

于 2010-03-22T08:47:37.250 に答える