我有一个看起来像的查询:
SELECT 'asdf', '123' ...
FROM table1
LEFT JOIN table2
on
(
condition1
)
LEFT JOIN table3
on
(
condition2
)
where
(
main_condition
)
现在的问题是,我还需要有条件地包含table1
。我试过这个:
..
..
FROM table1
on
(
new_condition
)
..
..
但它不起作用。请帮忙。
编辑(新发现): 在这篇文章(http://blog.sqlauthority.com/2010/07/20/sql-server-select-from-dual-dual-equivalent/)中,我找到了这段代码:
SELECT 1 as i, f.bar, f.jar FROM dual LEFT JOIN foo AS f on f.bar = 1 WHERE dual.dummy = ‘X’
UNION
SELECT 2 as i, f.bar, f.jar FROM dual LEFT JOIN foo AS f on f.bar = 2 WHERE dual.dummy = ‘X’
我确定它与我正在尝试做的事情没有直接关系,但可以JOIN
这样的表格DUAL
吗?
答案 0 :(得分:3)
虚拟表:
首先从虚拟表中选择一条记录。 dual
就是这样一个表,它是为了这个目的而在MySQL中内置的。我将dual
包裹在一个子选择中,因为MySQL显然不允许左加入它。
SELECT 'asdf', '123' ...
FROM
(select 1 from dual) d
LEFT JOIN table1
on(
new_condition
)
LEFT JOIN table2
on
(
condition1
)
LEFT JOIN table3
on
(
condition2
)
完整(外部)加入
另一种解决方案虽然不同,但使用full join
或full outer join
,就像left join
和right join
一样。这是完全不同的,虽然你可以得到一个非常相似的结果:
select
*
from
table1
full outer join table2 on joincondition.
在上面的查询中,即使两个表中都没有匹配的记录,也会返回两个表中的所有记录。
答案 1 :(得分:1)
感谢您为讨论做出贡献。我找到了答案。这很简单:
SELECT temp_table.* FROM
(SELECT 'asdf', '123' ... FROM DUAL) temp_table
LEFT JOIN table1
on
(
new_condition
)
LEFT JOIN table2
on
(
condition1
)
LEFT JOIN table3
on
(
condition2
)
where
(
main_condition
)
有趣的问题。也许这次我最喜欢自己的问题:)
答案 2 :(得分:0)
你无法在ON子句中创建这个新条件
on子句就在您加入时,但您可以在where子句
中添加此新条件例如
where
(
main_condition
)
AND
(
new condition
)
编辑:
试试这个
SELECT 'asdf', '123' ...
FROM (select 'asdf', '123' ... FROM table1 WHERE new_condition ) t
^^--your new condition here
LEFT JOIN table2
on
........
EDIT2:如果您的新情况可能出错,您可以制作if语句
where
(
main_condition
)
AND
(
if(new condition is something , do something , else do something else)
)
EDIT3:
SELECT 'asdf', '123' ...
FROM (select 'asdf', '123' ... FROM table1 where main condition
UNION
select 'asdf', '123' ... FROM table1 WHERE new_condition ) t
^^--your new condition here
LEFT JOIN table2
on
........
答案 3 :(得分:0)
您需要在第一次加入的on
子句中包含条件:
SELECT 'asdf', '123' ...
FROM table1 LEFT JOIN
table2
on condition1 AND new condition LEFT JOIN
table3
on condition2
where main_condition
在where
使用left join
子句时要小心。通常,您希望将这些条件移动到on
子句中,因为它们可能会无意中撤消左外连接的效果(将其转换为inner join
)。
答案 4 :(得分:0)
我最好的猜测是迄今为止的评论。
SELECT 'asdf', '123' ...
FROM table1
FULL OUTER JOIN table2 --NOTE THE FULL OUTER here all records in table 2 and only those that match in table 1
on
condition1 AND
new_condition=True
LEFT JOIN table3
on
(
condition2
)
where
(
main_condition
)