在两个表之间连接,行数

时间:2015-02-03 16:06:37

标签: sql oracle join

我希望你很好。

我尝试用两个表之间的连接编写一个sql查询,如下所示:

  

table1(id_master,id)

  1,1
  1,2
  1,3
  1,4
  1,5-

第二个表

  

table2(id_master,id)

  1,1
  1,2
  1,3
  1,4-

如您所见,每张表都包含ID_master& ID。 table2包含table1的acknownledgement(ack)。 table1中的每一行必须在table2中有一个“ack”。

在我的例子中,我没有结果,因为(table1(1,5)在table2中没有得到一个ack,当table1.row(1,5)在table2中得到一个ack时我想要结果。

我尝试过加入,但是当我们有第一个“确认”时我有结果。当我拥有所有“ack”时,我想得到结果。

我希望能够清楚。

感谢您的帮助。

亲切的问候

编辑:

谢谢stripathi& JPW,

例1:

  

table1(id_master,id)
  1,A
  1,B
  1,C
  2,d
  2,E

第二个表

  

table2(id_master,id)
  1,A
  1,B
  2,d
  2,E

我的查询结果必须是:

  

2,d
  2,E

因为我们可以找到行(2,D)和& (2,E)在两个表中,但不是(1,*)的情况(它错过了表2中的(1,C))。

2 个答案:

答案 0 :(得分:0)

我认为这两个查询都应该按照您的意愿执行,并且它们似乎可以使用Oracle 11g R2(请参阅此SQL Fiddle)。请注意,如果第二个表包含第一个表中不存在的项,结果可能是错误的。

select * 
from table1 
where id_master in (
  select a.id_master 
  from table1 a
  group by a.id_master
  having count(distinct a.id) = (
    select count(distinct b.id) 
    from table2 b
    where a.id_master = b.id_master
    group by b.id_master
  )
);

select * 
from table1 a 
where not exists (
  select id from Table1 where id_master = a.id_master
  minus 
  select id from Table2
); 

答案 1 :(得分:0)

如果您使用oracle,则可以使用ROWNUM获取first ack的行号。你可以试试这个:

SELECT ID,ID_MASTER FROM(
    SELECT ID,ID_MASTER,ROWNUM RR
    FROM TABLE2 
    ORDER BY ID_MASTER,ID ASC) T2
WHERE RR >= (
    SELECT R FROM(
        SELECT ID_MASTER,ID, ROWNUM R
        FROM TABLE1
        ORDER BY ID_MASTER,ID ASC
    ) T1
    WHERE T1.ID_MASTER||T1.ID NOT IN(SELECT ID_MASTER||ID FROM TABLE2)
)