mysql - 简化 LEFT JOIN

标签 mysql left-join

所以我有这个查询:

  SELECT c1.field1, c2.field2
  FROM table1 c1
  LEFT JOIN table1 c2 ON c1.field1 = c2.field1 AND c1.field2 = :arg1 AND c2.field2 <> :arg1
  LEFT JOIN table2 cc ON c2.field2 = cc.field2 AND cc.field3 = :arg2
  WHERE (c2.field2 IS NULL OR cc.field2 IS NOT NULL)
  ORDER BY ISNULL(c2.field2) ASC

这有两件事:

  1. 选取给定 field2 值的 table1.field1
  2. 选取一个 table1.field2,其中 field1 与上一点中的相同,并且还具有第二个表中的特定属性。 (只是因为标准化才这么复杂)如果不存在则返回NULL

虽然这有效,但它真的很难看。有没有更简单的版本做同样的事情?我最关心的是第二个 JOIN 需要是 LEFT 后跟这个 WHERE 。我觉得 INNER 应该更简单,但它不起作用。

最佳答案

尝试将左连接转换为unioninner join,然后您可以得到如下新查询:

SELECT c1.field1, null as field2
FROM table1 c1
  UNION ALL
SELECT c1.field1, c2.field2
FROM table1 c1
INNER JOIN table1 c2 ON c1.field1 = c2.field1 
INNER JOIN table2 cc ON c2.field2 = cc.field2 
WHERE c1.field2 = :arg1 AND c2.field2 <> :arg1 AND cc.field3 = :arg2 

首先,我通过拆分 where 子句将原始查询从 join 转移到 union,如下所示:

SELECT c1.field1, c2.field2
FROM table1 c1
LEFT JOIN table1 c2 ON c1.field1 = c2.field1 AND c1.field2 = :arg1 AND c2.field2 <> :arg1
WHERE (c2.field2 IS NULL )
  UNION ALL
SELECT c1.field1, c2.field2
FROM table1 c1
INNER JOIN table1 c2 ON c1.field1 = c2.field1 AND c1.field2 = :arg1 AND c2.field2 <> :arg1
LEFT JOIN table2 cc ON c2.field2 = cc.field2 AND cc.field3 = :arg2
WHERE (c2.field2 IS NOT NULL AND cc.field2 IS NOT NULL)

但是 union 的第一部分可以像这样保持传输:

SELECT c1.field1, null
FROM table1 c1
WHERE c1.field2 <> :arg1 --c2.field2 must be null
  UNION ALL
SELECT c1.field1, c2.field2
FROM table1 c1
LEFT JOIN table1 c2 ON c1.field1 = c2.field1  AND c2.field2 <> :arg1
WHERE c1.field2 = :arg1 AND c2.field2 IS NULL

最后,我得到了将所有左联接转移到联合和内联接的顶级查询。

我没有任何数据,所以我不确定我的说法是否正确。希望有帮助。

关于mysql - 简化 LEFT JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29294033/

相关文章:

php - 选择下一项

sql - 使用 dplyr::left_join (R lang) 与 SQL LEFT JOIN 处理 NA/NULL 的差异

c# - 左加入 Linq 查询

php - 具有相同 PK 的 LEFT JOIN GROUP 结果

php - PDO 语句不适用于 LIKE

Mysql:2个ID的主键内部连接给出 "Range checked for each record"

mysql - Windows 7 中的 Ruby on Rails

php - SQLSTATE[HY000] [1045] 拒绝用户 'root' @'localhost' 的访问(使用密码 : YES) symfony2

mysql - 当我使用 left join 和 group by 时,sum 不起作用

mysql - LEFT JOIN 与所有连接表的 id 列