首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化SQL查询-连接4个表

优化SQL查询-连接4个表
EN

Stack Overflow用户
提问于 2016-06-15 08:38:42
回答 3查看 240关注 0票数 1

我正试着把四张桌子连接起来。目前,我已经做到了这一点。

代码语言:javascript
复制
    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获得所有数据。

这样做很好,但恐怕会很慢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-15 08:53:18

我想你可以这样欺骗它:

首先,UNIONCD和只有连接到查询的其余部分之间,它应该会显着地改进查询:

代码语言:javascript
复制
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_idclient_id,并将其别名为New_Col_ID或其他任何东西。

此外,还可以索引表(如果尚未存在):

代码语言:javascript
复制
TableA(address_id,company_id)
TableB(address_id)
TableC(company_id,client_id)
TableD(company_id,branch_id)
票数 3
EN

Stack Overflow用户

发布于 2016-06-15 08:53:39

为什么要慢慢来?您可以选择客户端地址和分支地址并显示完整的结果。这听起来很直接。

您可以在ID上加入,这应该是快速的(因为应该有相应的可用索引)。您可能需要在

代码语言:javascript
复制
create index idx_c on tableC(client_id, company_id)

代码语言:javascript
复制
create index idx_d on tableD(branch_id, company_id)

但是:UNION对于DBMS来说是一项很大的工作,因为它必须查找和消除重复项。还能有吗?否则使用UNION ALL

票数 0
EN

Stack Overflow用户

发布于 2016-06-15 09:03:35

尝试CTE,这样您就不必为工会通过TableA和TableB两次了。

代码语言:javascript
复制
; 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 = ?
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37830249

复制
相关文章

相似问题

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