我正在尝试加入4个表格。目前我通过这样做实现了它。
SELECT columns
FROM tableA
LEFT OUTER JOIN tableB ON tableB.address_id = tableA.address_id
INNER JOIN tableC ON tableC.company_id = tableA.company_id AND tableC.client_id = ?
UNION
SELECT columns
FROM tableA
LEFT OUTER JOIN tableB ON tableB.address_id = tableA.gaddress_id
INNER JOIN tableD ON tableD.company_id = tableA.company_id AND tableD.branch_id = ?
tableC和tableD的结构非常相似。让我们说tableC包含客户端的数据。 tableD包含客户端分支的数据。 tableA是公司,tableB是地址我的目标是从tableA获取数据,这些数据连接到表B(所有具有地址的公司)以及来自tableD和tableC的所有数据。
这很好,但我担心这会很慢。
答案 0 :(得分:4)
我认为你可以像这样欺骗它:
UNION
,C
之间的第一个D
以及仅与查询其余部分的联接,它应该显着改进查询:
SELECT columns
FROM TableA
LEFT OUTER JOIN tableB ON tableB.address_id = tableA.address_id
INNER JOIN(SELECT Columns,'1' as ind_where FROM tableC
UNION ALL
SELECT Columns,'2' FROM TableD) joined_Table
ON (joined_Table.company_id = tableA.company_id AND joined_Table.New_Col_ID= ?)
New_Col_ID
- >只需在同一列中同时选择branch_id
和client_id
,并将其别名为New_Col_ID
或其他任何内容
此外,您可以索引表格(如果尚未存在):
TableA(address_id,company_id)
TableB(address_id)
TableC(company_id,client_id)
TableD(company_id,branch_id)
答案 1 :(得分:0)
为什么这会慢?您选择客户端地址和分支地址并显示完整的结果。这似乎是直截了当的。
您加入ID并且这应该很快(因为应该有相应的索引)。您可能想在
上引入复合索引create index idx_c on tableC(client_id, company_id)
和
create index idx_d on tableD(branch_id, company_id)
然而:UNION
对于DBMS来说是很多工作,因为它必须寻找并消除重复。甚至可以有吗?否则使用UNION ALL
。
答案 2 :(得分:0)
尝试使用CTE,这样你就不必经过两次TableA和TableB来进行联合。
; WITH TempTable (Column1, Column2, ...)
AS ( SELECT columns
FROM tableA
LEFT OUTER JOIN tableB
ON tableB.address_id = tableA.gaddress_id
)
SELECT Columns
FROM TempTable
INNER JOIN tableC
ON tableC.company_id = tableA.company_id AND tableC.client_id = ?
UNION
SELECT Columns
FROM TempTable
INNER JOIN tableD ON tableD.company_id = tableA.company_id AND tableD.branch_id = ?