-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。所以目前我的 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 值?

4

2 回答 2

1

由于连接条件始终相同,您似乎正在寻找一个支点: http: //msdn.microsoft.com/en-us/library/ms177410 (v=sql.105).aspx

如果这不是您要查找的内容,请提供更多详细信息。示例数据和预期结果将是一个很好的开始。

于 2013-02-11T19:30:53.230 回答
1

简而言之,不——没有更有效或不同的方法可以做到这一点。您是否遇到性能问题,或者您是否发现代码笨拙?

无论如何,您可能希望对“一个真正的查找表”进行一些研究,这看起来相似(不完全相同),以了解此设计中的缺点和优点。

于 2013-02-11T22:35:56.730 回答