我的示例查询是:
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 ___"
这样的东西似乎是不可能的。
感谢您的帮助。
答案 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
。