我是SQL的新手。考虑下表(table1)
s_id v_id1 12 12 22 32 52 62 73 13 23 63 73 84 1…
另一个聚合查询,可能不太可能破坏任何大脑:
SELECT max(s_id) AS s_id, v_id FROM tbl WHERE s_id in (2, 3) GROUP BY v_id HAVING max(s_id) = 2;
分贝<>小提琴 这里
(另外,重复一遍 max(s_id) 应该有点便宜。)
max(s_id)
列出所有 v_id 为此 s_id = 2 被发现(1次或更多次),但不是更大 s_id = 3 。
v_id
s_id = 2
s_id = 3
https://www.db-fiddle.com/f/6H4ubXubMgJuoadXuxHbv4/0
SELECT t1.* FROM t1 WHERE s_id = 2 AND v_id NOT IN ( SELECT v_id FROM t1 WHERE s_id = 3 )
或者你可以改变你的 JOIN 查询到:
JOIN
https://www.db-fiddle.com/f/vCVDCV9sCu7F8QoFiU5in9/1
SELECT a.* from table1 a LEFT JOIN table1 b ON a.v_id = b.v_id AND b.s_id=3 WHERE a.s_id=2 AND b.v_id IS NULL
如果您正在寻找的解决方案将始终比较2和3,或3和4,或5和6(或第一个数字和它上面的数字),那么您可能会在b.s_id上使用左连接 - 对于第二个表为1,并且仅对于b.s_id的第二个值为null。
你在这里寻找的部分(如果你想避免子查询)也在v_id上加入,然后过滤到WHERE b.v_id IS NULL。
如果您只关心a.s_id = 2,请在WHERE子句中指定它。使用JOIN正确地将数据结合在一起。
`SELECT a.* from table1 a LEFT JOIN table1 b ON a.s_id = b.s_id -1 AND a.v_id = b.v_id WHERE b.v_id IS NULL AND a.s_id = 2`