假设我们有两张表。
TabA(Acol1,Acol2,Acol3)
TabB(Bcol1,Bcol2.Ccol3)要求类似于,连接Acol1上的两个表,Bcol1和if Acol3='C‘,那么除了上面的连接之外,还可以基于Acol2=Bcol2进行连接。我们能在单个SQL查询中实现吗?join是按记录操作还是按表操作?
我能得到的一个解决方案是使用联合,但我认为这不会是一个优化的解决方案。还有其他的解决方案吗?
我想到了另一个解决方案
SELECT A.*,B.* FROM TabA A
         INNER JOIN TabB B ON A.Acol1 = B.BCol1 
         and case when A.Acol3='C' then A.ACol2 else '1' end = 
             case when A.Acol3='C' then B.BCol2 else '1' end ;没有case和Union的其他解决方案吗?
提前感谢
发布于 2015-09-26 20:22:04
嗯,在考虑了这个问题之后,我想你可能只需要一个复杂的on子句:
select a.*, b.*
from tabA a join
     tabB b
     on a.col1 = b.col1 and
        (a.col3 <> 'C' or a.col2 = b.col2);注意:上面假设a.col2不是null (如果需要,很容易包含该条件)。
您可能需要手动计算出一些示例,才能看到or方法与case语句等效。
发布于 2015-09-26 20:35:13
如果您只想在TabA.col2上加入'C',那么在这些情况下,TabB.col2也将是'C‘,因为您已经从col1加入了。因此,您的输出将与您通过第一次连接得到的输出相同。
 select a.*, b.* from tabA a join tabB b
 on a.col1=b.col1这将在任何时候为您提供相同的输出。尝试在“C”的值上创建一个不同的方案。结果将始终是第一个join结果的子集。
https://stackoverflow.com/questions/32797117
复制相似问题