【问题标题】:SQL Multiple Joins not working as expectedSQL 多连接未按预期工作
【发布时间】:2017-08-04 19:23:48
【问题描述】:

当我尝试加入所有 4 个表时,以下查询不起作用(运行需要一个多小时,我必须最终终止查询而不返回任何数据)。 它在表 1,2 和 3 加入时有效,然后如果我尝试表 1,2 和 4 加入,但在我尝试加入以下所有 4 个表时不起作用。

Select * From
    (Select 
        R.ID, R.MId, R.RId, R.F_Name, R.F_Value, FE.FullEval, M.Name, RC.CC     
        FROM Table1 as R
        Inner Join Table2 FE
                ON R.ID = FE.RClId and R.MId = FE.MId and R.RId = FE.RId
            Inner Join Table3 as M
                 ON R.MId = M.MId and FE.MId = M.MId
               Inner Join Table4 as RC
                  ON R.RId = RC.RId and FE.RId = RC.RId and FE.Date = RC.Date

    ) AS a

注意: 1) RId 在表 3 中不可用。 2) 表 4 中没有 MId。

感谢您的帮助。

【问题讨论】:

  • 尝试使用LEFT JOIN 而不是INNER JOIN
  • not working as expected 是什么意思?
  • 有什么问题?你收到一张空桌子吗?查询是否崩溃?
  • 很抱歉错过了那条信息。运行需要一个多小时,我最终必须在不返回任何数据的情况下终止查询。
  • 如果您想提高此查询的性能,请补充有关您正在使用的数据库(oracle、slq-server、mysql 等)的信息,因为每个产品的性能提高方法有些不同。还请生成查询的查询计划(解释计划、执行计划)并将其附加到问题中。将[query-optimization]标签附加到您的问题可能是个好主意。

标签: sql sql-server join query-optimization jointable


【解决方案1】:

由于您提到您无权查看查询计划,请尝试分解为每个表连接。您还可以检查哪个表连接需要时间来检索记录。从那里,您可以调查数据为什么需要时间。可能是因为表 3 和表 4 中的列键不可用?

WITH Tab1_2 AS
(SELECT r.ID, r.MId, r.RId, r.F_Name, r.F_Value, fe.FullEval, fe.date
   FROM Table1 as r
  INNER JOIN Table2 fe
     ON r.ID = fe.RClId
    AND r.MId = fe.MId
    AND r.RId = fe.RId
  WHERE ... -- place your conditions if any
),

Tab12_3 AS
(SELECT t12.*, m.Name
   FROM Tab1_2 t12
  INNER JOIN Table3 as m
     ON t12.MId = m.MId
  WHERE ... -- place your conditions if any
),

Tab123_4 AS
(SELECT t123.ID, t123.MId, t123.RId, t123.F_Name, t123.F_Value, t123.FullEval, rc.CC
   FROM Tab12_3 t123
  INNER JOIN Table4 as rc
     ON t123.RId = rc.RId 
    AND t123.Date = rc.Date
  WHERE ... -- place your conditions if any
)

SELECT *
  FROM Tab123_4 t1234

【讨论】:

  • 你好。感谢您的推荐。不幸的是,在进行更改并运行近 1 小时后没有结果,所以我不得不停止查询。注意:我可以加入表 1,2 & 3,我可以在 2 分钟内看到结果。我还可以加入表 1,2 和 4,我可以在 2 分钟内看到结果。就在我尝试加入所有 4 张桌子时,我不知所措! :(
  • 我终于运行了将近 2 小时的查询,出现以下错误:由于文件组“DEFAULT”中的磁盘空间不足,无法为数据库“TEMPDB”分配新页面。
猜你喜欢
  • 2018-02-06
  • 1970-01-01
  • 2013-08-06
  • 1970-01-01
  • 2020-05-08
  • 2011-10-27
  • 2015-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多