首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何优化此VIEW语句?

如何优化此VIEW语句?
EN

Stack Overflow用户
提问于 2011-07-07 22:31:38
回答 3查看 246关注 0票数 3

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

下面是view语句。

代码语言:javascript
运行
复制
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,但我不确定如何将其与视图集成。我希望视图有一个主键或组合键。我不能使用其他列,因为所有列都可以有空值和重复值。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-07-07 22:50:49

您可以使用外部联接进行联接和比较,然后使用COALESCE优先使用T2而不是T1。

为了保留唯一键,并假设您的id都是正数,您可以将一个表的id设为负数。

代码语言:javascript
运行
复制
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语句...

(这与上面的功能相同,但可以针对不同的精度规则进行修改。)

代码语言:javascript
运行
复制
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'
票数 3
EN

Stack Overflow用户

发布于 2011-07-07 22:50:23

如果您确定不会有重复项,那么您可以通过将UNION替换为不带ALLUNION ALL来增强它。查询的结果将被排序,当UNIONing时,重复项将被删除。请参阅http://dev.mysql.com/doc/refman/5.0/en/union.html

票数 2
EN

Stack Overflow用户

发布于 2011-07-07 22:55:57

这应该看起来像这样:

代码语言:javascript
运行
复制
SELECT 
    IFNULL(t2.Col1, t1.Col1) Col1,
    IFNULL(t2.Col2, t1.Col2) Col2,
    IFNULL(t2.Col3, t1.Col3) Col3,
    IFNULL(t2.Col4, t1.Col4) Col4,
    '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 
    t1.Column3 ='String'
ORDER BY 
    Col4

如果数据库中的table2列可以有正常的NULL值,那么这个SELECT应该像这样开始:

代码语言:javascript
运行
复制
SELECT 
    IF(t2.id is NULL, t1.Col1, t2.Col1) Col1,
    IF(t2.id is NULL, t1.Col2, t2.Col2) Col1,
    IF(t2.id is NULL, t1.Col3, t2.Col3) Col1,
    IF(t2.id is NULL, t1.Col4, t2.Col4) Col1,
    'Add this string to the Last Column' 
    .
    .
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6612276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档