如何在视图的查询中替换UNION?

时间:2013-12-21 19:04:15

标签: mysql sql database optimization union

我创建了以下要在视图中使用的查询

SELECT 
          *
      FROM
          customers c
      JOIN
          customer_business cb
      ON
          c.customer_id = cb.customer_id
union
SELECT 
          *
      FROM
          customers c
      LEFT JOIN
          customer_business
      ON
          business_id=NULL;

这使他的工作完美无缺。它显示了与业务相关的所有客户,并最终向所有客户显示业务信息为null。

customer_id    |    business_id
--------------------------------
      1        |        1
      2        |        1
      2        |        2
      1        |       NULL
      2        |       NULL
      3        |       NULL

但问题是UNION使视图的性能很差。

我尝试使用LEFT JOIN进行此操作,但并未显示业务为null的客户,只是没有任何业务关联的客户

我知道加速我的观点的解决方案是删除UNION,但我无法弄清楚如何。

任何人都可以帮助我吗?

由于

修改

这是一个例子

Customer Table
  customer_id  |      name
--------------------------------
      1        |      test1
      2        |      test2
      3        |      test3


Customer_business Table
  customer_business_id   |   customer_id   |   business_id
----------------------------------------------------------
      1                  |        1        |        1
      2                  |        1        |        2
      3                  |        1        |        3
      4                  |        2        |        1
      5                  |        2        |        2

Expected query result:
  name    |   customer_id   |   business_id
----------------------------------------------------------
  test1   |        1        |        1
  test1   |        1        |        2
  test1   |        1        |        3
  test2   |        2        |        1
  test2   |        2        |        2
  test1   |        1        |      NULL
  test2   |        2        |      NULL
  test3   |        3        |      NULL

2 个答案:

答案 0 :(得分:0)

根据以下评论和您想要的输出更新它。

请注意,我使用UNION ALLUNION更快,因为UNION使用DISTINCT来获取在您的情况下不适用的唯一记录。另外,请确保customer_id表中的Customer是PK并尝试在customer_id表中的Customer_Business上添加非唯一索引,这应该有助于提高性能。

SELECT name,
    C.customer_id,
    business_id
FROM Customer C
INNER JOIN Customer_Business CB
    ON C.customer_id = CB.customer_id
UNION ALL
SELECT name,
    C.customer_id,
    NULL
FROM Customer C

答案 1 :(得分:0)

排除我们知道不符合要求的联盟,另一个减慢查询速度的事情是第二个查询中的语句ON idbusiness = NULL。

我建议您像这样编辑查询并将效果视为视图:

SELECT c.customer_id, idbusiness
FROM customers c
JOIN customer_business cb ON c.customer_id = cb.customer_id
UNION 
SELECT customer_id, NULL 
FROM customers c

修改

寻找替代方案你可以尝试这个,它应该返回相同的输出(我已经用0改变了空值)但我不认为它更快:

SELECT c.customer_id, idbusiness
FROM customers c
INNER JOIN (

SELECT customer_id, idbusiness
FROM customer_business
UNION 
SELECT 0 , 0
)b ON ( c.customer_id = b.customer_id ) 
OR (
b.idbusiness =0
)

最终,您可以尝试仅将子查询b放入视图中,或者通过将值0,0作为表customer_business中的记录来删除联合。