2

我需要你的建议。

我的CASET-SQL 查询中有这样的语句:

CASE 
    WHEN PLAN_GIVEN IN ( this list contains 1700 values to compare ) THEN 'P1'
    WHEN PLAN_GIVEN IN ( this list contains 1800 values to compare ) THEN 'P2'  
    ELSE NULL
END AS PLAN_NAME

我无法列出所有 1700 个值IN ( ) THEN 'P1',因为所有这些值看起来都不好。

我尝试将 1700 个值和 1800 个值保存到lookup_table类似

lookup_table  

columnA = all 1700 values                 
columnB = all 1800 values

并使用了这个查询:

CASE 
    WHEN PLAN_GIVEN IN (SELECT columnA from lookup_table) THEN 'P1'
    WHEN PLAN_GIVEN IN (SELECT columnB from lookup_table) THEN 'P2'  
    ELSE NULL
END AS PLAN_NAME

上面的代码可以运行,但是需要更多的时间来执行将近 10 分钟才能完成执行。

有没有其他方法可以实现这一目标?

4

4 回答 4

3

我会将查找表更改为如下所示:

Value  Name
-----  ----
123    P1
456    P1
...    ...
789    P2
...    ...

聚集索引在Value.

之后,您可以简单地将查找表外连接并拉入 SELECT 子句,例如:LookupTable.Value = otherTable.PLAN_GIVENLookupTable.Name

SELECT
  ...
  lookup.Name AS PLAN_NAME,
  ...
FROM
  ...
  LEFT OUTER JOIN LookupTable lookup ON lookup.Value = otherTable.PLAN_GIVEN
WHERE...
...

请注意,我假设查找值是唯一的,考虑到您在 CASE 表达式中处理它们的方式,这在我看来是很自然的。

于 2013-07-12T09:15:18.737 回答
3

而不是使用PLAN_GIVEN IN,尝试使用EXISTS

CASE 
    WHEN EXISTS (SELECT NULL from lookup_table WHERE PLAN_GIVEN = columnA) 
         THEN 'P1'
    WHEN EXISTS (SELECT NULL from lookup_table WHERE PLAN_GIVEN = columnB) 
         THEN 'P2'  
ELSE NULL
END AS PLAN_NAME

或者,尝试加入您的查找表并与您的CASE表达式中的查找值进行比较:

SELECT ...
       CASE PLAN_GIVEN
           WHEN lookup_table.columnA THEN 'P1'
           WHEN lookup_table.columnB THEN 'P2'  
           ELSE NULL
       END AS PLAN_NAME
       ...
FROM ...
LEFT JOIN lookup_table 
  ON PLAN_GIVEN IN (lookup_table.columnA, lookup_table.columnB)
于 2013-07-11T18:28:57.837 回答
1

首先使用@MarkBannister 给出的解决方案之一。其次在你的lookup_table的每一列上放置索引。

 CREATE INDEX IX_lookup_table_A ON lookup_table(columnA)
 CREATE INDEX IX_lookup_table_B ON lookup_table(columnB)

即使lookup_table是临时表,仍然值得花时间添加索引。如果它是一个静态表,那么它的 WELL 值得花时间。

于 2013-07-11T23:02:22.630 回答
0

值得一试

select 'P1' 
from table 
where PLAN_GIVEN IN ( this list contains 1700 values to compare ) 
union 
select 'P2' 
from table 
where PLAN_GIVEN IN ( this list contains 1800 values to compare ) 

如果 PLAN_GIVEN 有索引,那么这可以使用索引。
我不认为 CASE 可以使用索引。

也许 TVP 而不是在

于 2013-07-11T22:46:29.377 回答