31

我的桌子是这样设置的:

table name: process
fields: name, id_string

table name: value_seach
fields: id_string, value

我想构造一个 select 语句,它将显示在 value_search 中没有条目的所有进程名称(及其各自的 id_string)。

进程表中的 id_string 可以为null,并且仍然有名称,但如果可能,需要排除这些名称。value_search 中的 id_string 永远不能为

我该怎么做呢?

4

4 回答 4

54

通常,如果您想要另一个表中不存在的行,则 LEFT JOIN 另一个表和 WHERE ... IS NULL 到第二个表上的列。您还提到您不希望 process.id_string 为 NULL 的行。

SELECT p.name, p.id_string
FROM
    process p
    LEFT JOIN value_search v
        ON v.id_string = p.id_string
WHERE
    v.id_string IS NULL
    AND p.id_string IS NOT NULL

这称为反连接。

于 2012-02-20T18:03:55.117 回答
29

我相信Not Exists在这里使用将是您的最佳选择。

SELECT p.name, p.id_string
FROM process p
WHERE 
   NOT p.id_string IS NULL AND
   NOT EXISTS(
          SELECT NULL
          FROM value_search v
          WHERE p.id_string = v.id_string)
于 2012-02-20T18:08:05.710 回答
5

你想要的查询应该是这样的。请注意,JOIN 将比 WHERE 子句中的子查询快得多。

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
   AND p.id_string IS NOT NULL
   AND v.id_string IS NULL

上述查询的一个同样有效的变体是:

SELECT p.name, p.id_string
FROM process p
LEFT OUTER JOIN value_search v
   ON p.id_string = v.id_string
WHERE
   p.id_string IS NOT NULL
   AND v.id_string IS NULL
于 2012-02-20T18:02:41.077 回答
2
SELECT 
  name,
  id_string
FROM process
WHERE id_string IS NOT NULL AND id_string NOT IN SELECT id_string FROM value_seach
于 2012-02-20T18:02:21.450 回答