我正在开发使用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值?
这是难以辨别你的要求。有问题吗?你有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
你为什么要在值(123456)上做5个连接? – Paparazzi 2013-02-11 18:59:18
好吧,我修复了上面的TSQL代码。请不要迷失在细节中。主要的一点是我有一个查询表,我正在加入。我想要一个更有效的方法将varchar值包含到我的主表A中。我该怎么做?就像我可以使用CTE或其他逻辑?是的,“123456”是唯一标识符。所以目前有30个不同的uniqueidentifier值它加入。 – salvationishere 2013-02-11 19:10:38