排除具有关联值的所有记录

时间:2016-08-03 16:25:24

标签: sql-server sql-server-2008 tsql

cnsmr_pymnt_tag表中有多个与cnsmr表中的每个消费者相关联的付款代码。

如果任何消费者的付款都有下面列出的标签ID之一(416,417,2823等),那么我不希望结果中有cnsmr_idntfr_id

如果消费者的付款都没有其中一个tag_ID,我的代码可以正常工作,但如果消费者混合使用了我的列表中的Tag_ID代码,那么我得到的结果不正确,消费者数量最终会在我的结果

我理解它正在完成我正在告诉的内容,但是如何更改它以便消费者号码不在结果中,如果它与任何tag_ID值相关联?

SELECT DISTINCT
 cnsmr.cnsmr_idntfr_agncy_id 
FROM        
 cnsmr_pymnt_jrnl 
 INNER JOIN
 cnsmr_pymnt_tag ON cnsmr_pymnt_jrnl.cnsmr_pymnt_jrnl_id = cnsmr_pymnt_tag.cnsmr_pymnt_jrnl_id 
 INNER JOIN
 tag ON cnsmr_pymnt_tag.tag_id = tag.tag_id 
 INNER JOIN
 cnsmr ON cnsmr_pymnt_jrnl.cnsmr_id = cnsmr.cnsmr_id
WHERE  
 cnsmr_pymnt_tag.TAG_ID NOT IN  
 (        416  -- VOLUNTARY
         ,417  -- VOLUNTARY
         ,2823 -- VOLUNTARY SPEED PAY
         ,583 -- SPEED PAY
         ,1130  -- VOLUNTARY TVOLCC
         ,581 -- VOLUNTARY LBXVOL TAG
 )

2 个答案:

答案 0 :(得分:0)

尝试像这样修改你的代码

WHERE  
 cnsmr_pymnt_tag.TAG_ID NOT IN  
 (        416  -- VOLUNTARY
  )
and 
 cnsmr_pymnt_tag.TAG_ID NOT IN  (471)

......等等

或者,您也可以尝试下面的内容..

;with cte(tag)
as 
 (        416  -- VOLUNTARY
         ,417  -- VOLUNTARY
         ,2823 -- VOLUNTARY SPEED PAY
         ,583 -- SPEED PAY
         ,1130  -- VOLUNTARY TVOLCC
         ,581 -- VOLUNTARY LBXVOL TAG
 )
 (your whole query as in question) wq
join
cte c
on c.tag<>wq.tag

答案 1 :(得分:0)

如果我正确理解您的要求,您正在寻找一个消费者ID列表,这些消费者ID绝对没有标签为416,417,581,583,1130,2823的付款期刊。如果这是正确的,您可能想要什么只是一个简单的不存在,将使任何支付期刊上任何这些标签的消费者ID无效

SELECT DISTINCT
C.cnsmr_idntfr_agncy_id
FROM cnsmr AS M
WHERE NOT EXISTS
(
    SELECT 1
    FROM tag AS T
        JOIN cnsmr_pymnt_tag AS CPT
            ON T.tag_id = CPT.tag_id
        JOIN cnsmr_pymnt_jrnl AS CPJ
            ON CPT.cnsmr_pymnt_jrnl_id = CPJ.cnsmr_pymnt_jrnl_id
        JOIN cnsmr AS C
            ON CPJ.cnsmr_id = C.cnsmr_id
    WHERE T.tag_id IN (416,417,581,583,1130,2823)
        AND C.cnsmr_id = M.cnsmr_id
)