Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: prosty SQL?

witam,

panowie i panie, mam chwilowy brak mózgu albo po prostu zaćmienie.

chce wybrac z jednej tabelki wiersze których nie ma w dwoch innych tabelkach.... i nie umiem :>

ratunkuu

konto usunięte

Temat: prosty SQL?

Wersja szkolna:

select *
from table_a
where column_a not exists in (select column_b from table_b)
and column_a not exists in (select column_c from table_c);

Wersja szybka (Oracle, w innych bazach może być inny zapis złączenia jednostronnego):

select table_a.*
from table_a, table_b, table_c
where column_a = column_b (+)
and column_a = column_c (+)
and column_b is null
and column_c is null;

Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: prosty SQL?

ale chodzi o cale niepowtarzalne wiersze, nie rekordy w kolumnach, druga opcja z left joinami bardziej mi pasuje

dzieki, jak cos nie pojdzie to sie odezwe ale chyba juz zatrybiłem poprawnie
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: prosty SQL?

Jacek O.:ale chodzi o cale niepowtarzalne wiersze

Są jeszcze w zależności od systemu baz danych operatory EXCEPT, INTERSECT (działające tak jak UNION, tutaj przykład z PostgreSQL), które coś takiego robią.

Temat: prosty SQL?

mozna jeszcze tak:

SELECT * FROM tbl_a
WHERE
tbl_a.klucz NOT IN
(SELECT tbl_b.klucz FROM tbl_b
UNION
SELECT tbl_c.klucz FROM tbl_c)

...chodz wersja z joinami jest wydajniejsza.
pozdr.
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: prosty SQL?

nie rozwiązuje to problemu
wynik -0 wierszy, dlatego ze wyklucza kolumny a nie wiersze

Temat: prosty SQL?

Mozesz podac przykladowe dane z tych tabel oraz efekt jaki chcesz uzyskac zapytaniem?


//dopisane
Sproboj uzyc funkcji CHECKSUM:

SELECT * FROM tbl_a
WHERE
CHECKSUM(*) NOT IN
(SELECT CHECKSUM(*) FROM tbl_b
UNION
SELECT CHECKSUM(*) FROM tbl_c)

Zakladajac ze wszystkie kolumny sa 'comparable' powinno zadzialac.


Łukasz Gojowy edytował(a) ten post dnia 05.02.07 o godzinie 12:52
Jacek Ołowiak

Jacek Ołowiak kierownik zespołu IT

Temat: prosty SQL?

ciezko bedzie skopiowac tutaj dane ale:

tabelka1

kol1 kol2 kol3 kol4
jacek olowiak stce 83
janek kowalski stce 21
jacek kwiatek wawa 13

tabelka2
kol1 kol2 kol3 kol4
jacek kwiatek wawa 83
janek olowiak stce 13
jacek kowalski wawa 13


trzecia tabelka ma zbieranine roznych danych. chodzi o to ze wiersze ktore sa w tych dwoch tabelkach nie moga wystapic w trzeciej.
not like kol1, kol2 ,kol3, kol4 wywali z glownej tabeli dane w ktorych sa jacek, janek, kowalski, olowiak, kowalski, kwiatek, 83, 13, 21

a chodzi mi o to aby nie bylo w trzeciej konkretnego układu jacek olowiak stce 23 a juz np jacek olowiak stce 24 ma byc

mam nadzieje ze zrozumiale wytlumaczylem

Temat: prosty SQL?

tak, teraz jest jasniej. Sugeruje funkcje CHECKSUM jak w przykladzie ktory wkleilem wczesniej.

Daloby sie tez zlączyc kolumny do pojedynczego wyrazenia np. tak:
SELECT kol1 + ' ' + kol2 + ' ' + kol3
i traktowac je jako pojedyncza kolumne, ale wowczas jesli w kol1 wystapi "janek kowalski", w kol2 bedzie "" to taki rekord bedzie rownoznaczny z kol1 = "janek" i kol2 = "kowalski", wiec takie rozwiazanie nie daje zawsze jednoznacznych rezultatow.

reasumując - sproboj CHECKSUM :)
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: prosty SQL?

Łukasz G.:reasumując - sproboj CHECKSUM :)

Reasumując - EXCEPT ;)

SELECT * FROM tabelka 3
EXCEPT
(SELECT * FROM tabelka1 UNION SELECT * FROM tabelka2)

przy założeniach, że wszystkie mają kolumny tego samego typu w takiej samej kolejności i używamy PostgreSQL/SQL Server/SQLite/Oracle (operator nazywa się bodajże MINUS)...
Tomasz Poradowski

Tomasz Poradowski Specjalista od
wytwarzania
oprogramowania

Temat: prosty SQL?

Łukasz G.:Daloby sie tez zlączyc kolumny do pojedynczego wyrazenia np. tak:
SELECT kol1 + ' ' + kol2 + ' ' + kol3
i traktowac je jako pojedyncza kolumne

A to zależy już od bazy danych - bo jeśli w kolumnie jest wartość NULL, to najczęściej całe wyrażenie staje się NULLem.

Temat: prosty SQL?

Nie zauwazylem Twojego pierwszego postu. EXCEPT rzeczywiscie pasuje do rozwiazania tego problemu.

Z tego co widze, nie ma go w MSSQL2000 (tylko w Analysis Services), za to pojawia sie juz w 2005. Nie wiem jak w innych systemach.

Co do rozwiazania z laczeniem kolumn, dodawanie nulla do czegokolwiek oczywiscie spowoduje wynulowanie sumy, tak jak piszesz. Podobnie dodawanie intow do varcharow i generalnie roznych typow nie zawsze zadziala - taka linie kodu trzeba "ubrac" w ISNULL, CONVERT itd. tak aby otrzymany rezultat byl spojny.

Czyli podlaczam sie pod Twoj wybor EXCEPT, a jesli nie jest dostepny w danym DBMSie, pozostaje lopatologiczne rozwiazanie z laczeniem kolumn, ktore powinno zadzialac wszedzie.

Następna dyskusja:

Prosty trigger na MySQL




Wyślij zaproszenie do