我正在使用 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。所以目前我的 sproc 代码看起来像:
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 的文章,但我不想汇总任何数据。相反,我想将 event_header_x 中的键 id 值转换为 user_defined_lut_rv 中的 varchar 值。
来自 event_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 值?