左加入交叉申请

时间:2016-07-14 17:44:12

标签: sql sql-server join

我有3张桌子; A为10000行,B为392540行,C为200189行。

如果我这样查询,

SELECT * FROM A a
LEFT JOIN B b 
ON b.Id = a.Id

我会在一分钟内得到结果。此外,如果我这样查询,

SELECT * FROM A a
CROSS APPLY(SELECT *
            FROM C c
            WHERE c.Id = a.Id
           ) com

它还会在一分钟或更短的时间内返回数​​据。 但是当我把三者结合起来时,

SELECT * FROM A a
LEFT JOIN B b
   ON b.Id = a.Id
CROSS APPLY (SELECT * 
             FROM C c
             WHERE c.Id = a.Id 
            ) com 

查询在30分钟后仍在运行。请注意,我使用CROSS APPLY而不是INNER JOIN,因为INNER JOIN需要更长的时间。我已经尝试用OUTER APPLY替换LEFT JOIN,但似乎没有任何效果。有人可以建议一个更好的方式来加入这些表吗?感谢。

EDIT 表由客户提供。我只在表B中添加了逻辑。对于A和C,我直接从他们提供的表中获取它。这是我对表B做的事情

DECLARE @B AS TABLE(
        [Id] nvarchar(max)
,       [Name] nvarchar(max)
,       [ProductId] nvarchar(max)
,       [ProductName] nvarchar(max)
)
INSERT INTO @B
  SELECT 
        a.[Id]
    ,   a.[Name]
    ,   a.[ProductId]
    ,   a.[ProductName]
  FROM ( SELECT
              [Id]
          ,   [Name]
          ,   [ProductId]
          ,   [ProductName]
          ,   ROW_NUMBER() OVER(PARTITION BY [Id] ORDER BY [Name] DESC) num
          FROM tableBbyClient 
          WHERE [Description] = 'AS'
        ) a
  WHERE a.num=1

0 个答案:

没有答案