2011-12-21 17 views

Odpowiedz

27

można zawinąć go w sub-kwerendy tak:

SELECT * 
FROM (
     select (select A from B where ...) as C from D 
    ) subq 
WHERE 
    C like ' ... ' 
+1

+1 Skończyłeś przede mną ... –

+0

Myślę, że to powinno zadziałać, ale myślę, że nie mogę go wykorzystać do mojego celu. Potrzebuję stworzyć coś takiego jak "wybierz pole1, pole2, sql3 jako pole3, pole4, sql5 jako pole5 z tabeli, gdzie pole2 =" ... ", pole5 =" ... " – Eddie

+0

@Ddie, tak, możesz tego użyć. przenieść części klauzuli where, która używa pola pochodnego podkwerendy do zewnętrznej, gdzie klauzula: –

7

Czy to czytasz?

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

Podzapytanie jest SELECT w innym oświadczeniu.

Począwszy od wersji MySQL 4.1, wszystkie formaty podkwerend i operacje wymagane standardem SQL , a także kilka funkcji, które są , są specyficzne dla MySQL.

Oto przykład podkwerendzie:

SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2); 

W tym przykład SELECT * FROM t1 ... jest kwerenda zewnętrzna (zewnętrzny lub oświadczenie), i (SELECT kolumna1 Z t2) jest podzapytaniem. Mówimy, że podzapytanie jest zagnieżdżone w zapytaniu zewnętrznym, a w rzeczywistości możliwe jest zagnieżdżenie podkwerendy w innych podzapytaniach na znaczną głębokość. Podzapytowanie musi zawsze pojawiać się w nawiasach.

Główne zalety podzapytania są:

Pozwalają zapytań, które są tak skonstruowane, że możliwe jest izolować każdą część oświadczeniu.

Zapewniają alternatywne sposoby wykonywania operacji, które w innym przypadku wymagałyby złożonych połączeń i związków.

Wiele osób uważa podzapytanie za bardziej czytelne niż złożone połączenia lub związki . Rzeczywiście, była to innowacja podzapytania który dał ludziom oryginalny pomysł wywoływania przedwczesnego SQL „Zapytanie Structured Język”.

Oto oświadczenie przykład, który pokazuje najważniejsze punkty dotyczące składni podzapytanie w sposób określony przez SQL standardowe i obsługiwane w MySQL:

1

No nie, jak pokazano; ale możesz uruchomić kwerendę w obu miejscach. lub utworzyć tabelę temp z tych wyników i połączyć je w udostępnianie zapytania ..

Select C from D inner join (Select A from B where...) C on C.1=D.1 where C like....

+0

Myślałem o uruchomieniu zapytania w obu miejscach, tak ... najprościej) – Eddie

0

Jeśli masz na myśli porównanie wyników podzapytania w przypadku gdy, tak można to zrobić.

select X ... where (select Y ...) = Z

Jednak chyba zły pomysł.Generalnie, kiedy musisz to zrobić, najlepiej jest znaleźć sposób na usprawnienie go w głównym wyborze. Istnieją bardzo twórcze sposoby unikania zagnieżdżonych zapytań. Powodem jest to, że każda selekcja musi wykonać zapytanie wewnętrzne za każdym razem, gdy za każdym razem, gdy chcesz wykonać argumenty przeciw podzapytaniu, wybierasz tylko wszystkie i stosujesz je. Jednak znowu, możesz po prostu zastosować inny, gdzie.

select X ... where Y = Z and A = B.

+0

Wiem, że to nie jest dobry pomysł, ale jest to najlepsze rozwiązanie dla mojego celu. Dzięki za odpowiedź. – Eddie

+0

@Eddie Rozumiem, że to może wydawać się najlepszym rozwiązaniem. Czy mogę zobaczyć przykład zapytania, które MUSISZ zagnieżdżać, aby sprawdzić, czy można je przerobić? Zagnieżdżony jest O (n), a to staje się niemożliwie nieprzyjemne. Jeśli zagnieżdżone zapytanie daje za każdym razem takie same wyniki, nie ma potrzeby stosowania zagnieżdżonych. –

+0

Potrzebuję utworzyć coś w stylu "wybierz pole1, pole2, sql3 jako pole3, pole4, sql5 jako pole5 z tabeli, gdzie pole2 =" ... ", pole5 =" ... " – Eddie

2

Chociaż jest to rzeczywiście ważny SQL:

select (select A from B where A = D.A) as C 
from D 

Jesteś znacznie lepiej-off (performance-wise) wdrażanie JOIN zamiast:

SELECT D.A 
FROM D 
INNER JOIN B ON B.A = D.A 
+0

Myślałem o DOŁĄCZYM, ale w ten sposób utrudni mi to w przyszłości. – Eddie

0

To zawsze lepiej dołączyć do tabeli zamiast podzapytać. tj Podkwerenda:

SELECT id, (SELECT abc FROM t2 WHERE ID = user_id) as user_name FROM t1 

Zarejestrowany:

SELECT c.id,u.abc FROM t1 as c LEFT JOIN t2 AS u ON u.ID = c.user_id WHERE 1=1 AND u.`user_login` = 'qwe123' 

Jeśli staramy się umieścić gdzie klauzula podzapytanie, to rzucają błąd.

Powiązane problemy