如何在mysql中删除多个左连接中的孤立行?

时间:2013-12-04 07:41:55

标签: mysql oracle sqlite

我正在使用此查询

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)

3 个答案:

答案 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;

» SQL Fiddle sample