如何在SQL中仅将一个条件应用于多个连接的一部分?

时间:2016-05-19 08:36:08

标签: sql join conditional-statements where having

我的示例查询是:

SELECT
    tab1.col1, tab2.col1, tab3.col2    
FROM
    tab1 JOIN tab2 ON tab1.col1=tab2.col1
    left JOIN tab3 ON tab1.col2=tab3.col2
WHERE blah blah GROUP BY blah blah HAVING blah blah;

我想将一个条件(例如"where" or "having")应用于其中一个连接但不应用于另一个。我该怎么做?

"SELECT ___, ___, ___ FROM tab1 JOIN tab2 ON ___ WHERE ___ JOIN tab3 ON ___ WHERE ___ GROUP BY ___"这样的东西似乎是不可能的。

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

SELECT
    tab1.col1, tab2.col1, tab3.col2    
FROM
    (select * from tab1 where / having) tab1 JOIN tab2 ON tab1.col1=tab2.col1
    left JOIN 
    (select  *from tab3 where / having) tab3 ON tab1.col2=tab3.col2

这是你想要的吗?

答案 1 :(得分:0)

以下可能对您有所帮助: -

select c.A,c.C ,tab3.col2 
from 
(select tab1.col1 A , tab1.col2 B,tab2.col1 C,tab2.col2 D from tab1 JOIN tab2 ON tab1.col1=tab2.col1 where _____) c
JOIN tab3 ON c.B=tab3.col2 where  ____ GROUP BY __________

答案 2 :(得分:0)

有多种方法可以实现

首先,只需将filter子句放在查询的末尾即可。大多数情况下,这必须产生相同的结果,尽管在某些情况下,情况可能并非如此。

SELECT
        tab1.col1, tab2.col1, tab3.col2
FROM
        tab1
JOIN
        tab2
        ON tab1.col1=tab2.col1
LEFT JOIN
        tab3
        ON tab1.col2=tab3.col2
WHERE
        blah blah
        AND
        desired_column=filter_value
GROUP BY
        blah blah
HAVING
        blah blah
;

第二个选项是使用嵌套查询。这种方法更有可能产生您喜欢的结果。智能查询优化器可以将此查询重写为上述查询,反之亦然。

SELECT
        tab1.col1, tab2.col1, tab3.col2
FROM
        tab1
JOIN
        (SELECT col1, col2 FROM tab2 WHERE desired_column=filter_value) tab2
        ON tab1.col1=tab2.col1
LEFT JOIN
        tab3
        ON tab1.col2=tab3.col2
WHERE
        blah blah
GROUP BY
        blah blah
HAVING
        blah blah
;

如果您使用INNER JOIN,第三个选项是将此作为加入条件的一部分提及

SELECT
        tab1.col1, tab2.col1, tab3.col2
FROM
        tab1
JOIN
        tab2
        ON tab1.col1=tab2.col1
        AND
        desired_column=filter_value
LEFT JOIN
        tab3
        ON tab1.col2=tab3.col2
WHERE
        blah blah
GROUP BY
        blah blah
HAVING
        blah blah
;

如果您不想过滤该集合,并且仅根据上述标准进行关联,您也可以将最后一个用于OUTER JOINs