将 `SELECT` .. `UNION ALL` `SELECT` .. 转换成更高效的东西?
Transform `SELECT` .. `UNION ALL` `SELECT` .. into something more efficient?
我有以下查询,它有效,但我想它是否可以改进为更高效的东西,如何做?
- 所有数值均来自1table
- 结果的第 1 部分始终是 2 行具有某种关系,形成 1 行并设置了所有字段
- 结果的第二部分是具有某些条件但未参与已经具有正确字段的第一部分的行
SELECT
row1.field1 AS field1,
row1.field2 AS field2,
row2.field3 AS field3,
FROM
table1 row1
JOIN
table1 row2
ON
row1.field = row2.field_reference
UNION ALL
SELECT
field1,
field2,
field3,
FROM
table1
WHERE
condition = 'I_am_sure_those_rows_are_not_returned_in_the_SELECT_above'
我想你想要一个 left join
:
SELECT row1.field1 AS field1, row1.field2 AS field2,
coalesce(row2.field3, row1.field3) AS field3,
FROM table1 row1 LEFT JOIN
table1 row2
ON row1.field = row2.field_reference;
returns 所有 行来自 table1
以及来自 table2
的匹配列(如果存在)。
*阅读@jarlh 对另一个答案的评论后编辑 - 应该是 COALESCE。
这个怎么样 - 在 WHERE 子句中使用 LEFT JOIN 加上 OR 语句应该 return 第 2 行中的所有那些 table 以及所有满足你的其他条件的所有那些。
SELECT
row1.field1 AS field1,
row1.field2 AS field2,
coalesce(row2.field3, row1.field3) as field3
FROM table1 row1
LEFT JOIN table1 row2 ON row1.field = row2.field_reference
WHERE
row2.field_reference is not null
OR condition = 'I_am_sure_those_rows_are_not_returned_in_the_SELECT_above'
我有以下查询,它有效,但我想它是否可以改进为更高效的东西,如何做?
- 所有数值均来自1table
- 结果的第 1 部分始终是 2 行具有某种关系,形成 1 行并设置了所有字段
- 结果的第二部分是具有某些条件但未参与已经具有正确字段的第一部分的行
SELECT
row1.field1 AS field1,
row1.field2 AS field2,
row2.field3 AS field3,
FROM
table1 row1
JOIN
table1 row2
ON
row1.field = row2.field_reference
UNION ALL
SELECT
field1,
field2,
field3,
FROM
table1
WHERE
condition = 'I_am_sure_those_rows_are_not_returned_in_the_SELECT_above'
我想你想要一个 left join
:
SELECT row1.field1 AS field1, row1.field2 AS field2,
coalesce(row2.field3, row1.field3) AS field3,
FROM table1 row1 LEFT JOIN
table1 row2
ON row1.field = row2.field_reference;
returns 所有 行来自 table1
以及来自 table2
的匹配列(如果存在)。
*阅读@jarlh 对另一个答案的评论后编辑 - 应该是 COALESCE。
这个怎么样 - 在 WHERE 子句中使用 LEFT JOIN 加上 OR 语句应该 return 第 2 行中的所有那些 table 以及所有满足你的其他条件的所有那些。
SELECT
row1.field1 AS field1,
row1.field2 AS field2,
coalesce(row2.field3, row1.field3) as field3
FROM table1 row1
LEFT JOIN table1 row2 ON row1.field = row2.field_reference
WHERE
row2.field_reference is not null
OR condition = 'I_am_sure_those_rows_are_not_returned_in_the_SELECT_above'