选择具有多个条件组合的sql

时间:2015-10-14 03:09:11

标签: sql oracle cascading-deletes

请帮我构建选择SQL,我的标准是

用户

  

USER_ID删除
  111个1
  222个0
  333 1

tab1

  

USER_ID删除
  111个1
  222个0
  333 0

tab2

  

USER_ID删除
  111个1
  222个0
  333 1

tab3

  

USER_ID删除
  111个1
  222个1
  333 0

对我而言,情况是如果删除了用户表中的user_id(删除= 1),则应删除tab1,tab2和tab3中的所有引用记录(删除= 1)。

我需要找出用户表中删除(删除= 1)的user_ids,但是他们的记录在tab1,tab2或tab3表中都保持活动状态(已删除= 0)

例如: user_id:111被删除,其所有其他表中的数据也被删除。但是user_id:333已被删除,但其在tab1和tab3中的记录仍然有效。我需要找出这些user_id,比如333。

请帮我构建select sql

2 个答案:

答案 0 :(得分:0)

试试这个

   SELECT USER_ID FROM USER AS A
    WHERE DELETED = 1
    AND EXISTS (SELECT 1 FROM TAB1 AS B WHERE A.USER_ID = B.USER_ID AND B.DELETED = 0)
    OR  EXISTS (SELECT 1 FROM TAB2 AS B WHERE A.USER_ID = B.USER_ID AND B.DELETED = 0)
    OR  EXISTS (SELECT 1 FROM TAB3 AS B WHERE A.USER_ID = B.USER_ID AND B.DELETED = 0)

答案 1 :(得分:0)

试试这个:

WITH x AS (SELECT 111 AS user_id , 1 AS deleted FROM dual UNION ALL 
                          SELECT 222 AS user_id, 0 AS deleted FROM dual UNION ALL
                         SELECT 333 AS user_id , 1 AS deleted FROM dual ),
         y as (SELECT 111 AS user_id , 1 AS deleted FROM dual UNION ALL 
                          SELECT 222 AS user_id, 0 AS deleted FROM dual UNION ALL
                         SELECT 333 AS user_id , 0 AS deleted FROM dual ),
         z as (SELECT 111 AS user_id , 1 AS deleted FROM dual UNION ALL 
                          SELECT 222 AS user_id, 0 AS deleted FROM dual UNION ALL
                         SELECT 333 AS user_id , 1 AS deleted FROM dual ),
         w as (SELECT 111 AS user_id , 1 AS deleted FROM dual UNION ALL 
                          SELECT 222 AS user_id, 1 AS deleted FROM dual UNION ALL
                         SELECT 333 AS user_id , 1 AS deleted FROM dual )

SELECT x.user_id FROM x, y, z, w 
WHERE x.user_id = y.user_id AND 
      x.user_id = z.user_id AND 
      x.user_id = w.user_id AND 
      x.deleted = 1 AND 
                  (x.deleted != y.deleted OR 
                   x.deleted != z.deleted OR
                   x.deleted != w.deleted);

OUTPUT将是:

   USER_ID
----------
    333