Połączenie 2 zapytań w jedno.

0

Cześć,

Zastanawiam się w jaki sposób połączyć dwa takie przykładowe zapytania bazujące na jednej tabeli w jedno zapytanie, tak aby wynikowe rekordy ułożyły się w postaci:

Col1, Col2 , Col3, Col4, Col5, Col6, Col6 (tylko ostatnie Col6 z wyniku 2 zapytania, pozostałe z 1)

(1)

SELECT TOP (100) Col1, Col2, Col3, Col4, Col5, Col6 FROM Table1 WHERE Col2 = '123' AND ( Col5 = '2' or Col5 = '3' ) ORDER by Col1

(2) Dla każdego rekordu wynikowego z zapytania 1 wykonywałem zapytanie

SELECT Col6 FROM Table1 WHERE Col4 = (Col4 z aktualnego rozpatrywanego rekordu) AND Col2 = '123' AND Col5 = '4'

Chciałbym to wszystko wyciągnąć za pomocą 1 zapytania. Do tej pory wyniki z (1) wrzucałem do listy, a następnie foreachem wykonywałem zapytanie (2). Ze względów wydajnościowych chciałbym spróbować osiągnąć to za pomocą tylko jednego zapytania i porównać czasy w jakim dostaje wyniki. Niestety nie za bardzo ogarniam tworzenie podzapytań stąd zwracam się do Was z prośbą o pomoc :)

1

A nie myślisz o joinie do samej siebie?
Bo rzadko o tym są tutoriale, a jest legalne. To taki schemat:

select ... from Table1  t1 (left) join Table1 t2 on t1.X = t2.y

Źle mi się czyta twój przykład, z przyzwyczajenia wolę realne nazwy kolumn itd

1

a ile wyników daje drugie zapytanie? jak jeden to możesz po prostu włożyć drugie zapytanie w pierwsze:

SELECT TOP (100) Col1, Col2, Col3, Col4, Col5, (SELECT Col6 FROM Table1 innyRekord WHERE innyRekord.Col4 = aktualnieRozpatrywanyRekord.Col4 AND innyRekord.Col2 = '123' AND innyRekord.Col5 = '4') as Col6 FROM Table1 aktualnieRozpatrywanyRekord WHERE Col2 = '123' AND ( Col5 = '2' or Col5 = '3' ) ORDER by Col1

jak więcej to join

0

co to znaczy ostatnie z wyniku 2 zapytania - jak nie ma podanego porządku sortowania?

  • jeżeli to jednak ma być ostatnia wartość wg jakiejś kolumny to należy użyć CROSS APPLY lub OUTER APPLY,, np. zakładając, że ma być ostatnia względem col1
select top 100 a.col1, a.col2, a.col3, a.col4, a.col5, a.col6, b.col6 from table1 a outer apply (select top 1 col6 from table1 where col4=a.col4 and col2='123' and col5='4' order by col1 desc) b where a.col2='123' and (a.col5='2' or a.col5='3') order by a.col1
  • leżeli wartość maksymalna / minimalna to można użyć JOIN-a, np.
select top 100 a.col1, a.col2, a.col3, a.col4, a.col5, a.col6, b.col6 from table1 a left join (select col4, mac(col6) col6 from table1 where col2='123' and col5='4' group by col4) b on (a.col4=b.col4) where a.col2='123' and (a.col5='2' or a.col5='3') order by a.col1
0

Np. tak:
Rozwiązanie 1

SELECT TOP (100) t1.Col1, t1.Col2, t1.Col3, t1.Col4, t1.Col5, t1.Col6, t2.Col66
FROM 
	Table1 t1
	left join (SELECT Col66 FROM Table1  WHERE Col2 = '123' AND Col5 = '4') t2 on t2.Col4 = t1.Col4
WHERE t1.Col2 = '123' AND t1.Col5 in ('2' , '3' ) ORDER by t1.Col1

Rozwiazanie 2
Użyć with cte ... (może będzie czytelniej)

1 użytkowników online, w tym zalogowanych: 0, gości: 1