列名

时间:2016-08-24 08:40:44

标签: sql sql-server join

我遇到过这个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是不正确的翻译。目前,虽然我对pcodeccode使用的任何值的查询都获得了相同的结果。

问。较低的SQL查询是正确的转换还是执行上层SQL查询的替代方法?

如果有帮助,两个表都有一个名为s

的公共列

1 个答案:

答案 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的标准部分。