如何在此示例中使用intersect(也可能是minus)

时间:2012-05-29 14:08:05

标签: sql oracle intersect

假设我有两张桌子:

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。但是怎么样?或者我会错过什么?有任何想法吗?谢谢

2 个答案:

答案 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)