我遇到过这个SQL,它在外部查询的列名中有一个select语句:
select w1, w2, w3, (select s from parttype where parttype.p = wt.p) s
from wtype wt
where
pcode = 'aPcode'
and ccode = 'aCcode'
它会返回如下结果:
w1 | w2 | w3 | s
---|----|----|---
0 | 1 | G | F
这让我感到困惑,所以我改写了这样:
select w1, w2, w3, wt.s
from wtype wt, parttype
where
pcode = 'aPcode'
and ccode = 'aCcode'
and parttype.p = wt.p
此查询也会返回相同的结果:
w1 | w2 | w3 | s
---|----|----|---
0 | 1 | G | F
现在,烦恼的是我是否通过下面的重写SQL将正确上面的SQL翻译过来,或者是我重写的SQL是不正确的翻译。目前,虽然我对pcode
和ccode
使用的任何值的查询都获得了相同的结果。
问。较低的SQL查询是正确的转换还是执行上层SQL查询的替代方法?
如果有帮助,两个表都有一个名为s
答案 0 :(得分:3)
如果parttype
中有多个行具有相同的p
值,您将获得不同的行为。
第一个查询将生成错误。第二个查询将生成多个结果行。你不认识哪一个你认为正确的。
如果parttype
中的没有行代表特定的p
值(正如Thorsten在评论中指出的那样),您也会得到不同的行为。如果要复制该行为,则需要LEFT JOIN
。
更好的重写是使用显式连接:
select w1, w2, w3, wt.s
from wtype wt
inner join parttype pt
on
wt.p = pt.p
where
pcode = 'aPcode'
and ccode = 'aCcode'
自1992年以来,它们只是SQL的标准部分。