3

我有两个表如下:

tblCountry (countryID, countryCode)

tblProjectCountry(ProjectID, countryID)

tblCountry表是所有国家及其代码的列表,并且该tblProjectCountry表将某些国家与某些项目相关联。我需要一个 SQL 语句,它为我提供了一个国家列表,其国家代码在tblProjectCountry表中没有关联记录。到目前为止,我到了这里:

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

至少有两种方法可以找到不相关的记录。

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

rohancragg和其他人建议使用NOT EXISTSor的各种版本: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个项目的表,第一次和第二次查询之间没有显着差异。然而,在超过 3M项目的桌面上,第二个版本(使用NOT EXISTS)的表现要好得多。

所以像往常一样,值得检查两个版本。

于 2010-03-22T08:50:26.777 回答
0

选择...其中 ID 不在(选择...)

于 2010-03-22T08:47:37.250 回答