当您加入时,您会得到部分笛卡尔产品。部分来自INNER JOIN条件。
因此,对于EM中分别有3行和4行的2行,输出中会得到7行。如预期。你问:“给我所有匹配行的EM和PR的部分笛卡尔乘积”
但是,你想要“给我在EM里有行的地方有PR的东西”。所以INNER JOIN是错误的结构。
您可以使用IN,EXISTS(或其他情况下的INTERSECT),并且它们对于后一个问题在语义上都是正确的。
在这种情况下,您使用IN是错误的地方。正如我之前所说,整个“测试”条件应该推入子查询中。
因此,这两种都是正确的
停止所有的加盟条件!
select
EM.Employee, rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from
EM EM
WHERE
EXISTS (SELECT *
FROM
PR PR
JOIN
TabFields TF ON PR.WTS1 = TF.WTS1
WHERE
PR.WTS2 = '' AND
TF.custInclude = 'Y' and TF.WBT2 = '' AND
EM.Employee = PR.ProjMgr
)
select
EM.Employee, rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from
EM EM
WHERE
EM.Employee IN (SELECT PR.ProjMgr
FROM
PR PR
JOIN
TabFields TF ON PR.WTS1 = TF.WTS1
WHERE
PR.WTS2 = '' AND
TF.custInclude = 'Y' and TF.WBT2 = ''
)
使用2英寸更接近原始查询:
select EM.Employee,
rtrim(EM.FirstName) + ' ' + rtrim(EM.LastName) as Name
from EM EM
WHERE
EM.Employee IN (SELECT PR.ProjMgr
FROM
PR PR
where PR.WTS1 in (Select distinct WTS1
from TabFields
where custInclude = 'Y' and WTS2 = '')
and PR.WTS2 = ''
)
order by Name
来源
2011-06-20 18:53:09
gbn
您应该尝试理解您之前的问题的答案并将其应用于此问题。如果你只是将论坛的答案复制粘贴到你的代码中,而不是试图理解,那么你正在走向成为代码猴的下坡阶段...... –
+ 100000000000000000 Remus指出它对**更重要了解**你在做什么。 – JNK
这是相同的查询,但你以前有过什么消毒?仅供参考:http://stackoverflow.com/q/6414550/27535 – gbn