我创建了以下要在视图中使用的查询
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
答案 0 :(得分:0)
根据以下评论和您想要的输出更新它。
请注意,我使用UNION ALL
比UNION
更快,因为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中的记录来删除联合。