我有一个很慢的 VIEW
。我不喜欢 VIEW 语句,因为有很多 JOINS
和 UNION
。
这是 View 语句。
Create VIEW NewView AS
SELECT t2.* FROM Table1 t1
JOIN Table2 t2
ON t1.Column1 = t2.Column1 AND t1.Column2 = t2.Column2
WHERE t1.Column3 !='String'
UNION
SELECT t1.*, 'Add this string to the Last Column' FROM Table1 t1
LEFT JOIN Table2 t2
ON t1.Column1 = t2.Column1 AND t1.Column2 = t2.Column2
WHERE t2.Column1 is null OR t1.Column3 ='String'
ORDER BY Column 4
基本上,如果 Table1
和 Table2
中存在一条记录,Table2
中的记录应该覆盖 Table1 中的记录
。我该如何优化它?
我在两个表中都有一个主键 id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
但我不确定如何将它与 View 集成。我希望 View 具有主键或复合键。我不能使用其他列,因为所有列都可以有空值和重复值。
最佳答案
您可以使用外部连接进行连接和比较,然后使用 COALESCE 来选择 T2 而不是 T1。
要保留唯一键,并假设您的 ID 都是正数,您可以将一个表的 ID 设置为负数。
SELECT
COALESCE(t2.id, -t1.id) AS id,
COALESCE(t2.Column1, t1.Column1) AS Column1,
COALESCE(t2.Column2, t1.Column2) AS Column2
FROM
Table1 AS t1
FULL OUTER JOIN
Table2 AS t2
ON t1.Column1 = t2.Column2
AND t1.Column2 = t2.Column2
WHERE
COALESCE(t2.Column3, t1.Column3) = 'String'
编辑:
对于选择哪个表具有优先权的更复杂规则,您可以只使用 CASE 语句...
(这与上述相同,但可以针对不同的优先级规则进行修改。)
SELECT
CASE WHEN t2.id IS NULL THEN -t1.id ELSE t2.id END AS id,
CASE WHEN t2.id IS NULL THEN t1.Column1 ELSE t2.Column1 END AS Column1,
CASE WHEN t2.id IS NULL THEN t1.Column2 ELSE t2.Column2 END AS Column2
FROM
Table1 AS t1
FULL OUTER JOIN
Table2 AS t2
ON t1.Column1 = t2.Column2
AND t1.Column2 = t2.Column2
WHERE
COALESCE(t2.Column3, t1.Column3) = 'String'
关于mysql - 如何优化此 VIEW 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6612276/