我正试着把四张桌子连接起来。目前,我已经做到了这一点。
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是地址,我的目标是从连接到表B的tableA (所有有地址的公司)获取数据,从tableD和tableC获得所有数据。
这样做很好,但恐怕会很慢。
发布于 2016-06-15 08:53:18
我想你可以这样欺骗它:
首先,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)发布于 2016-06-15 08:53:39
为什么要慢慢来?您可以选择客户端地址和分支地址并显示完整的结果。这听起来很直接。
您可以在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。
发布于 2016-06-15 09:03:35
尝试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 = ?https://stackoverflow.com/questions/37830249
复制相似问题