我怎样才能将条件应用于 SQL 中多重连接的一部分?
how can I apply a condition to just one part of a multiple join in SQL?
我的示例查询是:
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 ___"
似乎是不可能的。
感谢您的帮助。
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
这是你想要的吗?
以下可能对您有所帮助:-
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 __________
有多种方法可以实现
首先是将过滤子句简单地放在查询的末尾。大多数情况下,这必须产生相同的结果,但在某些情况下,情况可能并非如此。
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
一起使用。
我的示例查询是:
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 ___"
似乎是不可能的。
感谢您的帮助。
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
这是你想要的吗?
以下可能对您有所帮助:-
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 __________
有多种方法可以实现
首先是将过滤子句简单地放在查询的末尾。大多数情况下,这必须产生相同的结果,但在某些情况下,情况可能并非如此。
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
一起使用。