2015-05-11 16 views
5

Mam dwie tabele.Wybierz wartość z tabeli tylko jeśli istnieją w innej

Tabela pierwsza:

ID COLOR  
1 white 
2 red 
3 black 
4 blue 
5 yellow 

Tabela druga:

ID COLOR  
1 white 
2 white 
3 red 
4 black 

wyjściowe powinny być:

1 white 
2 red 
3 black 

(wykluczyć 2 wartości, które nie występują w drugim stole - niebieskie i żółty + wyklucz drugi biały).

Próbowałem różnych zapytań JOIN i EXIST, bez powodzenia. Dzięki.

+0

dwa stoły z tej samej nazwie. Czy nie jest to poważne naruszenie podstaw DB? –

+0

Łączenie wewnętrzne rozwiąże problem. – rechie

+0

Uprościliśmy mój kod. Pierwsza tabela zawiera wszystkie kategorie (ID, Cat), druga osoba z przypisanymi kategoriami (ID, tytuł, ...... Cat). Chcę wyprowadzać (w pętli) tylko te kategorie, które mają posty i nie są puste. – Tompo

Odpowiedz

8

where exists jest odpowiedni do tego.

select * 
    from t1 
    where exists 
    (select 1 
     from t2 where color = t1.color); 

demo here

Podzapytanie jest skorelowana Podzapytanie (co odnosi się do wartości w zakresie od drugiej zapytania) i jako takie nie jest wykonywany dla każdego rzędu zewnętrznego zapytania. Zatem wszystkie wewnętrzne zapytania muszą wykonać, sprawdzić i sprawdzić, czy kolor z zewnętrznej kwerendy (i pierwszej tabeli) jest obecny w drugiej tabeli.

+0

Dziękuję za demo :) – Devon

+0

Świetnie: _ +1 – Tompo

+0

Witam, możesz rozwiązać ten problem, chcę wyjaśnić jedną rzecz, chcę tej samej rzeczy, ponieważ nigdy tego nie robiłem, ale pozwól mi zapytać o to na przykład mam 3 tabeli; t1, t2, t3, mam wewnętrzne połączenie na nich jak t1.id wewnętrzne połączenie t2.id wewnętrzne sprzężenie t3.id moje gdzie byłby gdzie t1.id = 1 i t2.id = 1 i t3.id = 3 problem jest jeśli tylko istnieje w jakiejkolwiek tabeli, nie zwraca wyniku. Co należy zrobić w tym problemie? –

2
SELECT DISTINCT t1.* FROM t1 
INNER JOIN t2 ON t1.color = t2.color; 

Jeszcze jeden sposób, aby uzyskać to samo, co @pala_

+0

i wierzę (ktoś poprawi mnie, jeśli się mylę, proszę), ale także bardziej efektywnie, ponieważ dodanie klauzuli na złączu zmniejszy liczbę porównywanych rekordów w przeciwieństwie do porównania wszystkich rekordów w obu tabelach – dbinns66

+0

w rzeczywistości ta wersja wymusi korzystanie z tabel tymczasowych dzięki różnym - wersja 'where exists' wont. porównaj plan wyjaśniający [tutaj] (http://sqlfiddle.com/#!9/d796c/1) –

+1

@ dbinns66. . . Błędny. Wersja 'exist' powinna być bardziej wydajna. Nie ma 'select distinct'. –

Powiązane problemy