存储过程 - 排除单独表中的条件

时间:2014-08-07 12:46:18

标签: sql sql-server

我陷入困境,需要你的帮助。

我有一个存储过程,其中包含一些select语句,其中包含一些连接和许多条件foreach产品设置。结构如下所示。

SELECT * 
FROM TABLE1 T1
INNER JOIN T2 ON T1.ID = T2.ID
INNER JOIN T3 ON T1.ID = T3.ID
WHERE T1.STATUS = 'UnResolved'
AND
(
   T1.COL1 NOT IN ('X', 'Y', 'Z')

   AND (T1.Product != 'TEST1' OR T2.COL2 = 'V2' OR T3.COL3 = 'V3') 
   AND (T1.Product != 'TEST2' OR T2.COL2 = 'V2' OR T3.COL3 = 'V3') 

   AND (T1.Product != 'TEST3' OR T2.COL4 = 'V4' OR T3.COL5 = 'V5') 
   AND (T1.Product != 'TEST4' OR T2.COL4 = 'V4' OR T3.COL5 = 'V5') 
)

任何产品只有两种固定的可能设置。

设置1:或者T2.COL2 =' V2'或T3.COL3 =' V3'

设置2:或者T2.COL4 =' V4'或T3.COL5 =' V5'

每次有新产品进入时,我们都需要添加一个新的where条件及其各自的设置。

现在,对于新要求,我们需要使用任何配置表自动执行此过程。

有人可以在下面建议吗

@。表结构

@。修改选择查询,以便我们不需要修改现有条件

@。我们还需要注意现有逻辑不会破坏

非常感谢提前!!

2 个答案:

答案 0 :(得分:1)

使用列product_config创建表product, type, col1, col2product应该是 T1.product的外键。

为每个产品创建一行。 type指定使用col2, col3col4, col5中的哪一个。

product    type 
TEST1       1 
TEST2       1
TEST3       2
TEST4       2

然后查询将如下所示:

SELECT * 
FROM TABLE1 T1
INNER JOIN PRODUCT_CONFIG C ON (T1.PRODUCT = C.PRODUCT)
INNER JOIN T2 ON T1.ID = T2.ID
INNER JOIN T3 ON T1.ID = T3.ID
WHERE T1.STATUS = 'UnResolved'
AND
(
  T1.COL1 NOT IN ('X', 'Y', 'Z')

  AND (C.TYPE != 1 OR T2.COL2 = 'V2' OR T3.COL3 = 'V3')
  AND (C.TYPE != 2 OR T2.COL4 = 'V4' OR T3.COL5 = 'V5')
)

答案 1 :(得分:0)

之前我用过的一个解决方案是创建一个包含输入参数和where条件的查找表。例如,您可以创建一个包含以下列的表:

  1. PRODUCT_NAME
  2. PRODUCT_TYPE
  3. PRODUCT_PRICE
  4. WHERE_CLAUSE
  5. 使用这个查询查询,比如你有名字,类型&价:

    SELECT WHERE_CLAUSE FROM PRODUCT_CRITERIA WHERE PRODUCT_NAME = :PRODUCT_NAME AND  PRODUCT_TYPE = :PRODUCT_TYPE AND PRODUCT_PRICE = :PRODUCT_PRICE
    

    在oracle中,WHERE_CLAUSE可用于使用' EXECUTE IMMEDIATE'

    执行动态查询