2013-02-11 61 views
-1

我正在开发使用SSMS 2008 R2的TSQL查询,我想优化这个存储过程,目前使用了很多左联接。有一个包含一个行/查找值的查找表。所以,我的TSQL代码如下所示:如何优化查找表?

Table A = main record table 
Table B = Lookup Table 
    row1 x unique_identifier, y varchar(100) 
    row2 x unique_identifier, y varchar(100) 
    row3 x unique_identifier, y varchar(100) 
    row4 x unique_identifier, y varchar(100) 

所以在此查找表的每一行有两个值:一个unique_identifier,另一个值是VARCHAR。所以目前我的存储过程的代码如下所示:

select * 
FROM A 
LEFT JOIN B ON B.X = A.X WHERE B.X = 123456 
LEFT JOIN B2 ON B2.X = A.X WHERE B2.X = 123457 
LEFT JOIN B3 ON B3.X = A.X WHERE B3.X = 123458 
LEFT JOIN B4 ON B4.X = A.X WHERE B4.X = 123459 
LEFT JOIN B5 ON B5.X = A.X WHERE B5.X = 123451 

我敢肯定,必须有这样做虽然更有效的方式。而我真正的sproc代码实际上加入了这个查找表30次而不是5次。我也尝试使用临时表,但似乎并没有优化它。有关如何替换所有LEFT JOIN的建议?

好了,我现在正在更新这个问题。这是我的确切查询:

SELECT DISTINCT 
    lut.[description] as UDT_Injuries, 
    lut2.[description] as abduction, 
    lut3.[description] as ARREST_PARENT 
FROM evolv_cs.dbo.incident_header_x x with (nolock) 
LEFT JOIN user_defined_lut_rv lut on lut.user_defined_lut_id = x.UDT_Injuries 
LEFT JOIN user_defined_lut_rv lut2 on lut2.user_defined_lut_id = x.ABDUCTION 
LEFT JOIN user_defined_lut_rv lut3 on lut3.user_defined_lut_id = x.ARREST_PARENT 
WHERE lut.[description] IS NOT NULL OR lut2.[description] IS NOT NULL OR lut3.[description] IS NOT NULL 

和第10行输出的这个查询:

UDT_Injuries abduction ARREST_PARENT 
NULL NULL Outside of facility 
Client NULL NULL 
Client NULL Outside of facility 
None NULL NULL 
None NULL Outside of facility 
Other adult NULL NULL 
Other adult NULL Outside of facility 
Parent NULL NULL 
Peer NULL NULL 
Sibling NULL NULL 

仅供参考,我看着PIVOT和UNPIVOT的文章,但我不希望聚合任何数据。相反,我想将来自incident_header_x的关键id值转换为来自user_defined_lut_rv的varchar值。从incident_header_x

的样本数据是这样的:

UDT_Injuries ABDUCTION ARREST_PARENT 
5B84773B-99BF-4EB9-8545-EFC06A35FE29 NULL NULL 
NULL 4F18EDE9-BBBA-4430-9EF4-4E28EAC1E6D4 NULL 
5B84773B-99BF-4EB9-8545-EFC06A35FE29 NULL NULL 
NULL NULL 4F18EDE9-BBBA-4430-9EF4-4E28EAC1E6D4 
NULL NULL 5B84773B-99BF-4EB9-8545-EFC06A35FE29 

现在这是否有意义什么,我想达到什么目的?要将这些id值从user_defined_lut_rv查找表转换为varchar值?

+0

这是难以辨别你的要求。有问题吗?你有1行30查找表或30行查找表1行?您的代码看起来不像法律语法。 “select * FROM A LEFT JOIN B ON B.X = A.X WHERE B.X = 123456'(即使123456不是唯一标识符)有什么问题? – 2013-02-11 18:57:08

+0

你为什么要在值(123456)上做5个连接? – Paparazzi 2013-02-11 18:59:18

+0

好吧,我修复了上面的TSQL代码。请不要迷失在细节中。主要的一点是我有一个查询表,我正在加入。我想要一个更有效的方法将varchar值包含到我的主表A中。我该怎么做?就像我可以使用CTE或其他逻辑?是的,“123456”是唯一标识符。所以目前有30个不同的uniqueidentifier值它加入。 – salvationishere 2013-02-11 19:10:38

回答

1

总之,没有 - 没有更多要做到这一点有效的或不同的方式。你是否遇到性能问题,或者你觉得代码笨拙?

反正你不妨做一些研究“的一个真正的查询表”,此类似于(不相同),以获得缺点和优点的一些想法在这个设计中。

+0

好的谢谢。我希望有一种更有效的方法,但我会为此付诸行动。不管怎么说,多谢拉。 – salvationishere 2013-02-11 23:18:52

+0

通过更高效的方式,您是指更少的代码或更快的记录返回?你绝对不能将它归结为更少的代码 - 你需要提供该SQL中的所有逻辑来做你想做的事。你可以,如果你希望使用CROSS APPLY而不是LEFT JOIN,但它可能效率低下,我认为你不会节省太多的代码。更糟糕的是,当有人读取你的代码后,他们可能会认为你使用了CROSS APPLY是因为其他原因,即使存在性能问题也是如此。 – 2013-02-12 00:33:53