16

我正在尝试编写一个查询来查找在另一个表中没有匹配记录的记录。

例如,我有两个表,其结构如下所示:

表格1
    状态 | 产品 | 经销商 | 其他领域
    加利福尼亚州 | P1 | 一个 | xxxx
    或 | P1 | 一个 | xxxx
    或 | P1 | 乙| xxxx
    或 | P1 | X | xxxx
    西澳 | P1 | X | xxxx
    弗吉尼亚州 | P2 | 一个 | xxxx

表2
    状态 | 产品 | 版本 | 其他领域
    加利福尼亚州 | P1 | 1.0 | xxxx
    或 | P1 | 1.5 | xxxx
    西澳 | P1 | 1.0 | xxxx
    弗吉尼亚州 | P2 | 1.2 | xxxx

(State/Product/Distributor 共同构成 Table1 的 key。State/Product 是 Table2 的 key)

我想找到所有未使用分发服务器 X 的状态/产品/版本组合。(因此,此示例中的结果是 CA-P1-1.0 和 VA-P2-1.2。)

对查询有什么建议吗?

4

5 回答 5

34
SELECT
    *
FROM
    Table2 T2
WHERE
    NOT EXISTS (SELECT *
        FROM
           Table1 T1
        WHERE
           T1.State = T2.State AND
           T1.Product = T2.Product AND
           T1.Distributor = 'X')

这应该是 ANSI 兼容的。

于 2009-02-03T19:25:45.093 回答
12

在 T-SQL 中:

SELECT DISTINCT Table2.State, Table2.Product, Table2.Version
FROM Table2 
  LEFT JOIN Table1 ON Table1.State = Table2.State AND Table1.Product = Table2.Product AND Table1.Distributor = 'X'
WHERE Table1.Distributor IS NULL

不需要子查询。

编辑:正如评论所示, DISTINCT 不是必需的。谢谢!

于 2009-02-03T19:27:41.050 回答
1

select * from table1 where state not in(从表1中选择状态,其中分发者='X')

可能不是最聪明的,但应该可以。

于 2009-02-03T19:25:57.620 回答
1
SELECT DISTINCT t2.State, t2.Product, t2.Version
FROM table2 t2
JOIN table1 t1 ON t1.State = t2.State AND t1.Product = t2.Product
                AND t1.Distributor <> 'X'
于 2009-02-03T19:29:42.713 回答
1

在甲骨文中:

SELECT t2.State, t2.Product, t2.Version
FROM Table2 t2, Table t1
WHERE t1.State(+) = t2.State
  AND t1.Product(+) = t2.Product
  AND t1.Distributor(+) = :distributor
  AND t1.State IS NULL
于 2009-02-03T19:37:51.340 回答