JOIN中的SQL CASE语句 - 当其他表中的值存在时

时间:2018-03-01 12:51:00

标签: sql select db2 case

我有表T1

TICKETID
1
2

我有表T2

  ID  TICKETID   STATUS
  1   1          NEW 
  2   1          OPEN
  3   1          CLOSED
  4   2          NEW
  5   2          OPEN
  6   2          RETURNED

我想从T1中选择并使用T2进行JOIN,如果记录的状态始终处于RETURNED状态,那么我需要有一个值" YES"否则我需要有价值"否"

所以最后的结果应该是

  TICKETID RETURNED_FLAG
   1        NO
   2        YES

我试过这样的事情,但我不确定这是否是最佳的,甚至是正确的。

    SELECT T1.TICKETID, CASE (T2.ID) 
    WHEN NULL THEN 'NO'
    ELSE 'YES' 
    END  FROM T1
    LEFT OUTER JOIN T2 ON T1.TICKETID=T2.TICKETID AND T2.STATUS='RETURNED'

4 个答案:

答案 0 :(得分:1)

关闭。这是一种方式:

SELECT T1.TICKETID,
       (CASE WHEN COUNT(T2.ID) THEN 'YES' ELSE 'NO' END) as flag
FROM T1 LEFT OUTER JOIN
     T2
     ON T1.TICKETID = T2.TICKETID AND T2.STATUS = 'RETURNED'
GROUP BY T1.TICKETID;

更典型的方式是:

select t1.*,
       (case when exists (select 1
                          from t2
                          where t2.ticketid = t.ticketid and t2.status = 'RETURNED'
                         )
             then 'YES' else 'NO'
        end) as flag
from t1;

这应该有更好的表现,特别是t2(ticketid, status)上的索引。

答案 1 :(得分:1)

如果您只能在没有分组的情况下使用DECODE,则只能返回每张票:

SELECT T1.TICKETID,
    DECODE(T2.STATUS, 'RETURNED','YES','NO') as flag
FROM T1 LEFT OUTER JOIN T2
ON T1.TICKETID = T2.TICKETID AND T2.STATUS = 'RETURNED';

如果票证在T2中有多个RETURNED条目,这将导致该票证的多个YES行。

答案 2 :(得分:0)

试试这个:

SELECT TICKETID, 
       ISNULL((SELECT TOP(1) 'YES' 
               FROM T2 
               WHERE T1.TICKETID=T2.TICKETID AND T2.STATUS='STATUS'),
              'NO') AS RETURN_FLAG
FROM T1;

答案 3 :(得分:0)

您的查询是正确的,但不是您的案例利用率,您应该添加不同的删除副本:

SELECT distinct T1.TICKETID, 
CASE WHEN T2.ID IS NULL THEN 'NO' ELSE 'YES' END  FROM T1
LEFT OUTER JOIN T2 ON T1.TICKETID=T2.TICKETID AND T2.STATUS='RETURNED'

这里的多种方法也很好,但对我来说,保持简单。