我正在開發使用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