1

Temat: złączenie tabel: występuje - nie występuje

mam 3 przykładowe tabele

CREATE TABLE zadania (
  id_zad serial NOT NULL,
  zadanie character varying(30)
);

insert into zadania values (1,'test1');
insert into zadania values (2,'test2');
insert into zadania values (3,'test3');
insert into zadania values (4,'test4');
insert into zadania values (5,'test5');
insert into zadania values (6,'test6');
insert into zadania values (7,'test7');
insert into zadania values (8,'test8');
insert into zadania values (9,'test9');
insert into zadania values (10,'test10');

CREATE TABLE zalozenie (
  id_zal serial NOT NULL,
  id_zad integer NOT NULL
);

insert into zalozenie values (1,1);
insert into zalozenie values (2,2);
insert into zalozenie values (3,3);
insert into zalozenie values (4,4);
insert into zalozenie values (5,5);
insert into zalozenie values (6,6);

CREATE TABLE wykonanie (
  id_wyk serial NOT NULL,
  id_zad integer NOT NULL
);

insert into wykonanie values (1,5);
insert into wykonanie values (2,6);
insert into wykonanie values (3,7);
insert into wykonanie values (4,8);
insert into wykonanie values (5,9);
insert into wykonanie values (6,10);

Potrzebuję złączyć te tabele po id_zad tak aby wykazać 3 warianty w jednym zapytaniu:
występuje w wykonanie - nie występuje w zalozenie
występuje w wykonanie - występuje w zalozenie
nie występuje w wykonanie - występuje w zalozenie

w trzech zapytaniach to wiem jak zrobić, ale może jest sposób zrobić to w jednym zapytaniu.

2

Odp: złączenie tabel: występuje - nie występuje

Może tak:
select z.*
,exists(select 1 from wykonanie where id_zad=z.id_zad) and not exists(select 1 from zalozenie where id_zad=z.id_zad) as "występuje w wykonanie - nie występuje w zalozenie"
,exists(select 1 from wykonanie where id_zad=z.id_zad) and exists(select 1 from zalozenie where id_zad=z.id_zad) as "występuje w wykonanie - występuje w zalozenie"
,not exists(select 1 from wykonanie where id_zad=z.id_zad) and exists(select 1 from zalozenie where id_zad=z.id_zad) as "nie występuje w wykonanie - występuje w zalozenie"
from zadania z

3

Odp: złączenie tabel: występuje - nie występuje

nie napisałem, że tabela zadania ma blisko 2000 rekordów i ta lista musi być względem wykonania - gdyż w tej tabeli będzie ok 200 rekordów, w założeniu ok 300 więc potrzebuję sprawdzać względem wykonania.
w tym zapytaniu zwraca mi wszystkie zadania a potrzebuję wg założeń.

4

Odp: złączenie tabel: występuje - nie występuje

Ostatnio edytowany przez c_michal (2012-07-10 22:38:05)

5

Odp: złączenie tabel: występuje - nie występuje

Pisałem wczoraj na szybko i popełniłem błąd - ma być po wykonaniu i założeniu - wczoraj nie miałem już dostępu do neta żeby to naprostować.
Przy wstawianiu danych niepotrzebnie użyłem wszystkich id_zad (usuń z pierszej tabeli pierwsze 2 i z drugiej ostatnie 2)

insert into zalozenie values (1,3);
insert into zalozenie values (2,4);
insert into zalozenie values (3,5);
insert into zalozenie values (4,6);

insert into wykonanie values (1,5);
insert into wykonanie values (2,6);
insert into wykonanie values (3,7);
insert into wykonanie values (4,8);

teraz mamy 8 przypadków użycia id_zad - wszystkich w zadaniach jest 10
czyli wynik powinien wyglądać tak:
id_zad | zalozenie | wykonanie
3 | t | f
4 | t | f
5 | t | t
6 | t | t
7 | f | t
8 | f | t

brane są pod uwagę tylko te id_zad, które występują w tych dwóch tabelach: założenie + wykonanie


dopisałem na końcu twojego zapytania:

where exists(select 1 from wykonanie where id_zad=z.id_zad) or exists(select 1 from zalozenie where id_zad=z.id_zad)

i wynik jest poprawny.

Dzięki.

Ostatnio edytowany przez przesq (2012-07-11 10:16:42)