2015-02-03 2 views
0

Надеюсь, вы в порядке.Соедините две таблицы, количество строк

Я пытаюсь написать запрос SQL с соединения между двумя таблицами, как показано ниже:

table1 (id_master, ID)

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

И второй стол

таблица2 (id_master, ID)

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

Как можно видеть, каждая таблица содержит ID_master & Я бы. В таблице 2 указано значение acknownledgement (ack) таблицы1. Каждая строка в таблице1 должна иметь «ack» в таблице2.

В моем примере, я не имею никакого результата, потому что (table1 (1,5) не получил ПДТ в table2 и я хочу привести, когда table1.row (1,5) получил в table2 АСК.

Я попытался с присоединиться, но у меня есть результат, когда мы имеем первый «ACK». Я хочу, чтобы иметь результат, когда у меня есть все «извед».

Я надеюсь, что понятно.

спасибо за вашу помощь ,

вид касается

EDIT:

Спасибо stripathi & JPW,

example1:

table1 (id_master, ID)
1, А
1, B
1, C
2, D
2, Е

вторая таблица

таблица2 (id_master, ID)
1, A
1, B
2, D
2 , E

результат мой запрос должен быть:

2, D
2, E

Потому что мы можем найти строки (2, D) & (2, Е) в двух таблицах, но это не относится к (1, *) (он пропускает (1, C) в таблице2).

+0

Не задал вопрос. Из того, что я понимаю, вам нужно сделать, если не существует (таблица 1, кроме таблицы Table1 inner join Table2)) и поставить логику в блок. – stripathi

ответ

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

Привет jpw, второй запрос работает. большое спасибо. – shackdown

+0

, где я могу это сделать? – shackdown

+1

OK отлично, все готово. Благодарю. – shackdown

0

Если вы используете оракул вы можете использовать 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) 
) 
+1

@jpw О, я вижу, я обновил свой ответ. 'ROWNUM' должен иметь псевдоним. – RubahMalam

+0

Спасибо @rubahmalam. работает. – shackdown

Смежные вопросы