gpt4 book ai didi

sql - 帮助将子查询转换为带连接的查询

转载 作者:可可西里 更新时间:2023-11-01 08:08:21 24 4
gpt4 key购买 nike

我被困在一个带有连接的查询上。客户的站点正在运行 mysql4,因此子查询不是一个选项。我使用连接重写的尝试进行得不太顺利。

我需要选择 contractors 表中列出的所有承包商,这些承包商不在具有给定标签 ID 和县 ID 的 contractors2label 表中。然而,它们可能被列在contractors2label 与其他标签和县 ID。

表:承包商

cID (primary, autonumber)
company (varchar)
...etc...

表:contractors2label

cID
labelID
countyID
psID

这个带有子查询的查询有效:

SELECT company, contractors.cID
FROM contractors
WHERE contractors.complete = 1
AND contractors.archived = 0
AND contractors.cID NOT IN (
SELECT contractors2label.cID FROM contractors2label
WHERE labelID <> 1 AND countyID <> 1
)

我认为这个带有连接的查询是等价的,但它没有返回任何结果。手动扫描数据显示我应该得到 34 行,这就是上面的子查询返回的内容。

SELECT company, contractors.cID
FROM contractors
LEFT OUTER JOIN contractors2label ON contractors.cID = contractors2label.cID
WHERE contractors.complete = 1
AND contractors.archived = 0
AND contractors2label.labelID <> 1
AND contractors2label.countyID <> 1
AND contractors2label.cID IS NULL

最佳答案

在执行 LEFT JOIN 时, 你需要把 JOIN 的所有条件进入ON条款。

在您的示例中,您得到 NULL对于不存在的左连接列,但您随后将它们再次与值 ( <> 1) 进行比较,这是行不通的。

SELECT c.company, c.cID
FROM contractors c
LEFT JOIN contractors2label c2
ON ( c2.cID = c.cID AND c2.labelID <> 1 AND c2.countyID <> 1 )
WHERE c.complete = 1
AND c.archived = 0
AND c2.cID IS NULL

顺便说一句:使用别名(如我示例中的 c)可以让您更轻松地阅读和编写查询。

关于sql - 帮助将子查询转换为带连接的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2438379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com