Tsql 如何优化查找表?

Tsql 如何优化查找表?,tsql,sql-server-2008-r2,left-join,lookup-tables,Tsql,Sql Server 2008 R2,Left Join,Lookup Tables,我正在使用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

我正在使用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)
因此,该查找表中的每一行都有两个值:一个唯一的_标识符,另一个值是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
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
我相信一定有一个更有效的方法来做到这一点。我真正的存储过程代码实际上连接了这个查找表30次,而不是5次。我也尝试过使用临时表,但似乎也没有优化它。关于如何替换所有左侧联接有何建议

好的,我现在更新这个问题。这正是我的疑问:

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的文章,但我不想汇总任何数据。相反,我想将事件头中的键id值转换为用户定义的lut rv中的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
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值从用户定义的lut rv查找表转换为varchar值?

由于连接条件始终相同,您似乎在寻找一个轴:


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

简言之,没有-没有比这更有效或不同的方法。您是否有性能问题,或者您是否发现代码很难处理


无论如何,您可能希望对“一个真正的查找表”进行一些研究,这看起来与之类似,但并不完全相同,以便了解这种设计的优缺点。

很难看出您的要求。有什么问题吗?您有一个包含30行的查找表还是30个包含1行的查找表?您的代码看起来不像合法语法。即使123456不是唯一标识符,从B.X=A.X的左连接B中选择*有什么问题?为什么要对值123456进行5次连接?好的,所以我修复了上面的TSQL代码。请不要迷失在细节中。主要的一点是,我有一个要加入的查找表。我想要一种更有效的方法将varchar值包含到我的主表a中。我该怎么做?我可以用CTE或其他逻辑吗?是的,123456是一个唯一的标识符。因此,当前有30个不同的uniqueidentifier值与之关联。是否要在每个主记录中显示所有可能的查找值?请让我们知道想要的输出,一些演示数据会很有帮助。你能看看我更新的问题吗?好的,谢谢。我希望有一个更有效的方法,但我相信你的话。无论如何,谢谢。更高效是指所需代码更少,还是记录返回更快?你绝对不能把它归结为更少的代码——你需要在SQL中提供所有的逻辑来做你想做的事情。如果希望使用交叉应用程序而不是左连接,您可以这样做,但这样做可能效率低下,而且我认为您不会节省太多代码。更糟糕的是,当有人在事后阅读您的代码时,他们可能会认为您出于其他原因使用了交叉应用程序,即使存在性能问题,也会保持这种方式。