假设我有两张桌子:
TableA
ID, Time, Size
0 5:00 600
1 8:00 800
2 7:00 100
3 1:50 140
4 2:40 300
12 3:40 300
TableB
ID, Time, Size
8 5:00 600
1 8:00 800
2 8:00 900
3 1:50 140
5 2:40 300
12 3:40 300
现在我想比较这两个表:给出表A和B中ID相同的所有行(或者说两个表中存在ID的位置),但低于12 - 这样就可以了表格A ID 0, 4, 12
和表格B ID 8, 5, 12
之后我只剩3行了。现在我想踢掉所有行,其中整个TableA行ID == TableB行ID
之间有一个或多个区别最后会有(如果我看到正确的话)作为输出:
ID, Time, Size
1 8:00 800
3 1:50 140
对于这个解决方案,我需要确定相交,也许是减去。起初我认为这个SQL语句会做我想要的:
select * from TableA where ID < 12 intersect select * from TableB where ID < 12
minus
select * from TableB where ID < 12;
但这并不是那么好用。因为相交,我使用相交的整行,我应该只使用交叉ID和IF我有ID的交叉(即1,2,3)然后我必须使用ID {{1 } 减去 TableA with ID 1,2,3
。但是怎么样?或者我会错过什么?有任何想法吗?谢谢
答案 0 :(得分:3)
根据您的要求和您提供的测试数据,您根本不需要相交。仅仅INNER JOIN
就足够了。
SELECT a.*
FROM TableA a
INNER JOIN TableB b ON b.ID = a.ID AND b.Time = a.Time AND b.Size = a.Size
答案 1 :(得分:1)
select id from TableA where ID < 12 and id in (Select id from TableB)
union
select id from TableB where ID < 12 and id in (Select id from TableA)
或
SELECT id,
time,
size
FROM (SELECT *
FROM tablea
WHERE id < 12
UNION ALL
SELECT *
FROM tableb
WHERE id < 12) a
GROUP BY id,
time,
size
HAVING Count(*) = 2
或
SELECT *
FROM tablea A
WHERE EXISTS (SELECT 1
FROM tableb b
WHERE b.id = a.id
AND b.time = a.time
AND b.size = a.size)