【问题标题】:How to select records from one table that does exists in another [duplicate]如何从一个表中选择另一个表中存在的记录[重复]
【发布时间】:2012-10-29 07:22:47
【问题描述】:

我有两张桌子。 tlt2。每个表都有以下列:IDnameID 是 PK 和自动增量。这两个表没有相互连接。 t2.namet1.name 的子集,但在name 的字符串开头添加www. 之后。 例如:

`t1`.`name`= ggg
`t2`.`name`= www.ggg

我要做的是:选择t1.name未插入t2的所有记录。所以我写了以下查询:

select concat('www.',name) 
from db.t1
LEFT JOIN db.t2 
ON t2.name = t1.name
WHERE NOT EXISTS (select name from db.t2);

但是,我得到 0 结果。我确信在 t1 中有可用的记录,但在 t2 中没有。如何选择 t1 中所有不在 t2 中的名称??

【问题讨论】:

  • WHERE NOT EXISTS (SELECT name FROM db.t2) 将导致查询返回零或所有结果,具体取决于表 t2 是否包含任何行,因为它没有条件。

标签: mysql


【解决方案1】:
select concat('www.',name) 
from db.t1
LEFT JOIN db.t2 ON t2.name = concat('www.', t1.name)
WHERE db.t2.name IS NULL

【讨论】:

  • 这会返回 t1 中的所有记录。
  • 编辑了我的答案。请重试。
【解决方案2】:
SELECT CONCAT('www.', tbl1.name)
FROM db.t1 AS tbl1
WHERE NOT EXISTS (
    SELECT 1
    FROM db.t2 AT tbl2
    WHERE CONCAT('www.', tbl1.`name`) = tbl2.`name`
)

【讨论】:

  • 1) 我不明白你在第二次选择中提到的select 1 是什么意思。 2)当我假设那是 t2.name 它没有工作。它返回 t1 中的所有记录。
  • 在存在测试中,重要的是是否存在结果集。通过返回值 1 而不是记录,您可以减少要完成的工作量。
  • 不知道为什么这会返回 t1 中的所有记录。它明确指出,在添加 www 后,仅从 t1 返回那些在 t2 中没有与 t1 中的名称相同的记录的记录。到它的开头,匹配 t2 中的名称。在大多数情况下,EXISTS 测试比执行 JOIN 和测试 NULL 的性能更高。不过,只有测试才能确认任何一种方式。
【解决方案3】:

应该这样做:

select t.name FROM
(
 select concat('www.',t1.name) AS name
 from t1
) t
LEFT JOIN t2
ON t2.name = t.name
WHERE t2.name IS NULL

【讨论】:

    猜你喜欢
    • 2013-05-19
    • 2015-08-27
    • 2022-01-21
    • 2020-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2017-10-21
    相关资源
    最近更新 更多