2012-05-29 49 views
0

可以说,使用交叉(也许负)我有两个表:如何在这个例子中

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--以便从表B中除去表A ID 0, 4, 12并从表B ID 8, 5, 12

之后,我只剩下3行。现在我想踢出来的所有行那里是整个表A行ID之间的一个或多个差异==表B行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; 

但是,这不是很好。因为相交,Im使用相交的整个行,我应该只使用相交的ID和IF如果我有相交的ID(这将是1,2,3),那么我必须使用ID TableA with ID 1,2,3减去TableB with ID 1,2,3。但是如何?或者我错过了什么?有任何想法吗?谢谢

回答

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) 
+0

嗨。这个'in(select ..)'看起来不错。但是,为什么有工会,是不是更好地得到我想要的? – sabisabi

+0

Mysql减号用于仅查看来自不在另一个表中的表的记录。 –

3

从您的要求,您所提供的TESTDATA,你不需要相交于所有。仅仅是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 
+0

如果会有更多的3列(不仅是ID,时间和大小),可以说有100个? :)这将是一个非常大的SQL语句与内部加入权利?但它是一个很好的知识。 – sabisabi

+2

在这种情况下,我会使用'CHECKSUM(*)'并加入。 –

+0

@sabisabi - 敲打最后一条评论,似乎没有(易于使用的)Oracle校验和功能。 –