mysql - 如何优化此 VIEW 语句?

标签 mysql sql view query-optimization

我有一个很慢的 VIEW。我不喜欢 VIEW 语句,因为有很多 JOINSUNION

这是 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

基本上,如果 Table1Table2 中存在一条记录,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/

相关文章:

mysql - 重命名具有带触发器的表的数据库

mysql - 无效操作异常未处理 - 无法同时更新 2 个内容

javascript - 使用 Javascript 获取内容的高度,移动 Web View

Android:如何防止动态背景可绘制拉伸(stretch)

iOS:从 View 调用 MainWindow 中的方法?

php - 在 PHP : what can I expect? 中从持久连接切换到非持久连接

php - 使用数组更新 SQL 查询

java - 无法使用 JSP 从 Oracle 数据库检索值,出现 java.sql.SQLException : Result set after last row

sql - 更改两小时之间耗时的输出格式

mysql - 查询表名附加日期