我正在使用此查询
SELECT * FROM parent_table
LEFT JOIN child_tab ON parent_table.id = child_tab.parent_id
LEFT JOIN child_tab2 ON parent_table.id = child_tab2.parent_id
如果我添加这样的条件,如:
WHERE child_tab2.parent_id IS NOT NULL
OR child_tab.parent_id IS NOT NULL;
之后将删除孤立行。如果连接条件超过两个三个表,那很好
但是我不想在WHERE
子句中使用这种类型的实现,因为我的连接条件是动态的,并且没有子表是可变的。(最多可能是1到20)
答案 0 :(得分:2)
如果您的连接是可变的和动态的,除了在WHERE子句中进行过滤之外别无选择。但是,如果它感觉更优雅,你可以避免重复的OR OR OR,这可以简化where子句的逻辑表达式:
WHERE COALESCE(child_tab.parent_id, child_tab2.parent_id) IS NOT NULL
COALESCE()
接受一个包含多个参数的列表 - 不仅仅是两个 - 并返回最左边的not-null参数的值,如果它们都是null,则返回null。
http://dev.mysql.com/doc/refman/5.6/en/comparison-operators.html#function_coalesce
答案 1 :(得分:0)
我创造了一个小问题:SQLFiddle。
基本上,您需要使用UNION
:
SELECT *
FROM parent_table
JOIN (
SELECT
child_tab.parent_id as cparent_id,
child_tab2.parent_id as c2parent_id
FROM child_tab
LEFT JOIN child_tab2
ON child_tab.parent_id = child_tab2.parent_id
UNION
SELECT
child_tab2.parent_id as cparent_id,
child_tab.parent_id as c2parent_id
FROM child_tab
RIGHT JOIN child_tab2
ON child_tab.parent_id = child_tab2.parent_id
) AS s1
ON parent_table.id = s1.cparent_id
答案 2 :(得分:-1)
您的WHERE
毫无意义,因为LEFT JOIN
会忽略所有不匹配的(和NULL
)子表ID。
您可以使用以下内容:
SELECT * FROM parent_table
JOIN child_tab ON parent_table.id = child_tab.parent_id
LEFT JOIN child_tab2 ON parent_table.id = child_tab2.parent_id
UNION
SELECT * FROM parent_table
LEFT JOIN child_tab ON parent_table.id = child_tab.parent_id
JOIN child_tab2 ON parent_table.id = child_tab2.parent_id;
但是我看不到使用WHERE
子句的任何优势,如下所示:
SELECT *
FROM parent_table
JOIN child_tab ON parent_table.id = child_tab.parent_id
LEFT JOIN child_tab2 ON parent_table.id = child_tab2.parent_id
UNION
SELECT *
FROM parent_table
LEFT JOIN child_tab ON parent_table.id = child_tab.parent_id
JOIN child_tab2 ON parent_table.id = child_tab2.parent_id;