连接两个表,行数
Join between two tables, number of row
希望你一切都好。
我尝试编写一个 sql 查询,其中包含两个 table 之间的连接,如下所示:
table1 (id_master, id)
1,1
1,2
1,3
1,4
1,5
第二个table
table2 (id_master, id)
1,1
1,2
1,3
1,4
如您所见,每个 table 包含 ID_master & id。
table2 包含 table1 的确认 (ack)。 table1 中的每一行必须在 table2 中有一个 "ack"。
在我的示例中,我没有结果,因为 (table1 (1,5) 在 table2 中没有得到确认,而我想要 table1.row 时的结果 ( 1,5) 在 table2.
中有一个 ack
我试过加入,但是当我们有第一个 "ack" 时我得到了结果。当我拥有所有 "ack".
时,我想要结果
希望能说清楚
感谢您的帮助。
亲切的问候
编辑:
感谢 stripathi 和 jpw,
示例 1:
table1 (id_master, id)
1,A
1,B
1,C
2,D
2,E
第二个table
table2 (id_master, id)
1,A
1,B
2,D
2,E
我的查询结果必须是:
2,D
2,E
因为我们可以在两个 table 中找到行 (2,D) & (2,E),但 (1,*) 不是这样(它错过了 ( 1,C) 在table2).
我认为这两个查询都应该满足您的要求,而且它们似乎可以使用 Oracle 11g R2(参见 SQL Fiddle)。请注意,如果第二个 table 包含第一个 table.
中不存在的项目,则结果可能是错误的
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
);
如果您使用 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)
)
希望你一切都好。
我尝试编写一个 sql 查询,其中包含两个 table 之间的连接,如下所示:
table1 (id_master, id)
1,1
1,2
1,3
1,4
1,5
第二个table
table2 (id_master, id)
1,1
1,2
1,3
1,4
如您所见,每个 table 包含 ID_master & id。 table2 包含 table1 的确认 (ack)。 table1 中的每一行必须在 table2 中有一个 "ack"。
在我的示例中,我没有结果,因为 (table1 (1,5) 在 table2 中没有得到确认,而我想要 table1.row 时的结果 ( 1,5) 在 table2.
中有一个 ack我试过加入,但是当我们有第一个 "ack" 时我得到了结果。当我拥有所有 "ack".
时,我想要结果希望能说清楚
感谢您的帮助。
亲切的问候
编辑:
感谢 stripathi 和 jpw,
示例 1:
table1 (id_master, id)
1,A
1,B
1,C
2,D
2,E
第二个table
table2 (id_master, id)
1,A
1,B
2,D
2,E
我的查询结果必须是:
2,D
2,E
因为我们可以在两个 table 中找到行 (2,D) & (2,E),但 (1,*) 不是这样(它错过了 ( 1,C) 在table2).
我认为这两个查询都应该满足您的要求,而且它们似乎可以使用 Oracle 11g R2(参见 SQL Fiddle)。请注意,如果第二个 table 包含第一个 table.
中不存在的项目,则结果可能是错误的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
);
如果您使用 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)
)