Użycie subquery pod kwerend


Czasami by napisać dość uniwersalny kod potrzebujemy, a nawet należy użyć sub kwerend celem dynamicznego pozyskiwania z tabel danych do przeprowadzania takich operacji jak SELECT, UPDATE, DELETE lub INSERT. Możemy np stworzyć tabele słownikowe lub konfiguracyjne w których będziemy przechowywać informacje by ich nie duplikować i łatwo nimi zarządzać.



Czym jest sub kwerenda? Jest to polecenie SELECT umieszczone w innym bloku SELECT. Sub kwerenda może zwracać, kolumnę, wiersze lub pojedyńczą wartość. Użyć możemy jej z polceniami FROM, WHERE, HAVING, GRUP BY, ORDER BY.



Użycie sub kwerendy w SELECT





Przykład użycia polecenia select w innej kwerendzie:



select date,(select 1) from common

go




--------------

1970-01-01 1

1970-01-02 1

1970-01-03 1

1970-01-04 1

1970-01-05 1

1970-01-06 1



Efekt działania będzie taki, że dla każdego rekordu będzie wykonany drugi SELECT.

select a.date,(select swieto from innaTabela b where a.data = b.data) from common a

go




--------------

1970-01-01 tak

1970-01-02 nie

1970-01-03 nie

1970-01-04 nie

1970-01-05 nie

1970-01-06 nie



Użycie sub kwerendy w FROM





W klauzuli FROM możemy umieścić inne zapytanie, którego wynik będzie źródłem danych dla zewnętrznego zapytania. W wewnętrznym zapytaniu należy przestrzegać tych samych zasad co przy tworzeniu tabeli czyli: nie mogą powtarzać się nazwy kolumn, kolumny muszą mieć nazwy, a samo zapytanie musi być ujęte w nawiasach i mieć swój alias. Tak zapisane pod zapytanie możemy używać jak tali, czyli dokonywać zapytań oraz joinować z innymi tabeli lub sub kwerendami.



create table #dane (lp int identity(1,1), nazwa nvarchar(30), flaga int default 0)
insert into #dane (nazwa) values ('a'),('b'),('c'),('d'),('e')
insert into #dane (nazwa,flaga) values ('1',1),('2',1),('3',1),('4',1),('5',1)

select * from (select lp,nazwa,flaga from #dane where flaga=1) as subk

drop table #dane


Przykład z join
create table #dane (lp int identity(1,1), nazwa nvarchar(30), flaga int default 0)
insert into #dane (nazwa) values ('a'),('b'),('c'),('d'),('e')
insert into #dane (nazwa,flaga) values ('1',1),('2',1),('3',1),('4',1),('5',1)

select t.lp,s.nazwa from (select lp,nazwa,flaga from #dane where flaga=1) as s join #dane as t on s.nazwa = t.lp

drop table #dane




Użycie sub kwerendy w poleceniu WHERE





W poleceniu where możemy w pobierać pojedyńcze wartości lub kolumny w zależności od metody porównania np dla =,>,<,!= musi to być wartość skalarna dla IN i NOT IN wartość scalarna lub kolumna.



create table #dane (lp int identity(1,1), nazwa nvarchar(30), flaga int default 0)
insert into #dane (nazwa) values ('a'),('b'),('c'),('d'),('e')
insert into #dane (nazwa,flaga) values ('1',1),('2',1),('3',1),('4',1),('5',1)

select * from #dane where lp = (select top 1 lp from #dane order by lp desc) 

drop table #dane

go


w/w kod zadziała jak max(oczywiście lepiej użyć max).



create table #dane (lp int identity(1,1), nazwa nvarchar(30), flaga int default 0)
insert into #dane (nazwa) values ('a'),('b'),('c'),('d'),('e')
insert into #dane (nazwa,flaga) values ('1',1),('2',1),('3',1),('4',1),('5',1)

select * from #dane where lp in (select lp from #dane where flaga = 0) 

drop table #dane

go




Użycie sub kwerend i klauzuli HAVING





Kolejnym przydatnym zastosowaniem sub kwerend jest użycie ich z klauzulą HAVING. Klauzula ta pozwala na filtrowania danych na już z agregowanych wartościach. W n/w przykładzie pokaże jak filtrować za pomocą innego zapytania. Plus tego rozwiązania jest taki, że gdy zmieni się zawartość tabeli zapytania nam samo na te działanie zareaguje.



Przykład pokazuje jak za pomocą sub kwerendy filtrować wartości o takiej samej ilości wystąpień jak A ale od niej różnych.



create table #dane (lp int identity(1,1), nazwa nvarchar(30), flaga int default 0)
insert into #dane (nazwa) values ('a'),('b'),('c'),('d'),('e')
insert into #dane (nazwa) values ('a'),('b'),('c'),('d'),('e')

select count(lp),nazwa 
from #dane 
group by  nazwa  
having COUNT(lp) = (select COUNT(lp) from #dane  where nazwa in ('a')) and nazwa in (select nazwa from #dane where nazwa != 'a')

drop table #dane

go






Sub kwerendy sql





Zaletą stosowania sub kwerend w sql jest fakt, że pozwalają nam na dynamiczne zapisywanie warunków, które same reagują na zmiany danych w tabelach bez ingerowania w kod. Czasami też te konstrukcje są jedynym rozwiązaniem. Pozwalają na ominiecie potrzeby użyci tabel czasowych. Mogą być również sposobem na optymalizację gdyż zmniejszają ilość przetwarzanych rekordów dla innego zapytania.
powrót















SQL-KURSY.pl poleca:

Książki

Copyright 2010-2011mariuszhk@op.pl

obob ob

Valid HTML 4.01 Transitional

Strona internetowa wykorzystuje pliki cookie zapisywane w pamięci przeglądarki internetowej.

OK