我有表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'
答案 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'
这里的多种方法也很好,但对我来说,保持简单。