transferHistory
表:
╔════════════╦════════╗
║ sourceId ║ destId ║
╠════════════╬════════╣
║ 221 ║ 1 ║
║ 2223 ║ 1 ║
║ 2223 ║ 2 ║
║ 44 ║ 3 ║
║ 33 ║ 3 ║
║ 55 ║ 3 ║
║ 44 ║ 2 ║
╚════════════╩════════╝
因此,我想查找destId是给定ID且给定ID是源ID的唯一目标ID的所有行。
示例:
鉴于dest id = 1,结果应为221(因为源2223被划分为两个目的地1和2)
鉴于dest id = 2,结果应为空(因为源2223和44都划分为两个目标)
鉴于dest id = 3,结果应为33和55。
如何编写SQL来获取它?
答案 0 :(得分:1)
您只想要没有其他目标ID的源ID。这表明not exists
:
select t.*
from t
where t.destId = @destId and
not exists (select 1
from t t2
where t2.sourceId = t.sourceId and
t2.dest_id <> t.dest_id
);
如果希望所有符合条件的行,可以删除t.destId = @destId
。
答案 1 :(得分:1)
我认为您可以只查找只有一个目的地的sourceId,即
SELECT sourceId, destId
FROM transferHistory t
GROUP BY sourceId
HAVING COUNT(sourceId) = 1
输出:
sourceId destId
33 3
55 3
221 1
如果只想为特定的destId获取它们,请将其添加到HAVING
子句中:
SELECT sourceId, destId
FROM transferHistory t
GROUP BY sourceId
HAVING COUNT(sourceId) = 1 AND destID = 3
输出:
sourceId destId
33 3
55 3