【发布时间】:2011-05-30 10:10:11
【问题描述】:
我有一个非常脏的查询,肯定可以优化,因为其中有很多 CASE 语句!
SELECT
(CASE pa.KplusTable_Id WHEN 1 THEN sp.sp_id
WHEN 2 THEN fw.fw_id
WHEN 3 THEN s.sw_Id
WHEN 4 THEN id.ia_id END) as Deal_Id,
max(CASE pa.KplusTable_Id WHEN 1 THEN sp.Trans_Id
WHEN 2 THEN fw.Trans_Id
WHEN 3 THEN s.Trans_Id
WHEN 4 THEN id.Trans_Id END) as TransId_CurrentMax
INTO #MaxRazlicitOdNull
FROM #PotencijalniAktuelni pa LEFT JOIN kplus_sp sp (nolock) on sp.sp_id=pa.Deal_Id AND pa.KplusTable_Id=1
LEFT JOIN kplus_fw fw (nolock) on fw.fw_id=pa.Deal_Id AND pa.KplusTable_Id=2
LEFT JOIN dev_sw s (nolock) on s.sw_Id=pa.Deal_Id AND pa.KplusTable_Id=3
LEFT JOIN kplus_ia id (nolock) on id.ia_id=pa.Deal_Id AND pa.KplusTable_Id=4
WHERE isnull(CASE pa.KplusTable_Id WHEN 1 THEN sp.BROJ_TIKETA
WHEN 2 THEN fw.BROJ_TIKETA
WHEN 3 THEN s.tiket
WHEN 4 THEN id.BROJ_TIKETA END, '')<>''
GROUP BY CASE pa.KplusTable_Id WHEN 1 THEN sp.sp_id
WHEN 2 THEN fw.fw_id
WHEN 3 THEN s.sw_Id
WHEN 4 THEN id.ia_id END
因为我有几次相同的条件,你知道如何优化查询,让它更简单更好。欢迎所有建议!
提前TnX!
内曼加
【问题讨论】:
-
只有四个简单的 SELECT 语句,
KplusTable_Id的每个 case 一个,然后将它们联合在一起不是更容易吗?这样一来,您就可以忘记所有 CASE 的东西...... -
我会尝试使用 UNION。您是否有其他想法可以在这些情况下使用?看起来很常见的问题可能有一些已知的模式。
-
看起来这是对超类型/子类型结构的尝试,其中 pa.KplusTable_Id 是类型鉴别器。你能确认
sp, fw, s, id是pa的子类型吗?比如pa.Deal_Id = 1 and sp.sp_id = 1,那么在fw, s, id中是否有与_id = 1的记录? -
@Damir Sudarevic - 在这种情况下,可能有 fw_id=1、s_id=1 和 ia_id=1,但不会是相同的交易。 Deal 是唯一的,具体取决于 Deal_Id 和放置它的表(在这种情况下也可以是 KplusTable_Id)。我相信你理解你的问题,所以给出了适当的答案......
标签: sql sql-server tsql query-optimization case-statement