Warunek na składnikach wyniku zapytania

0

Chciałbym ograniczyć wyświetlanie wyników zapytania tak, by nie zwracać wyników z drugiej kolumny, jeśli znajdują się one w pierwszej z kolumn. Mogę prosić o radę, jak to zrobić? Zapytanie wygląda mniej więcej tak:

select pole1, pole2 from
(
select pole1 from (...)
)
join
(
select pole2 from (...)
)
on (cast(pole1 as varchar)+cast(pole2 as varchar) in (select ... ))

i nie wiem, w jaki sposób usunąć z listy wyników pole2, gdy znajduje się już ono na liście w kolumnie pole1

0

Spróbuj

SELECT 
   col1, 
   col2 
FROM 
       (SELECT col1,col2 FROM tab1 JOIN tab2....)
WHERE
   col1 <> col2
0

Niestety col1 i col2 są od siebie zawsze różne

0

Czekaj czekaj. Jeżeli dobrze teraz zrozumiałem, to chcesz raz mieć jedną kolumnę, a innym razem dwie w wyniku zapytania? Hmm tak się chyba nie da

0

Nie, sytuacja wygląda w ten sposób:

col1 col2
Y1 Y2
Y1 Y3
Y1 Y4
Y2 Y3
Y2 Y4

I chce zapobiec wyświetlaniu par (col1_y, col2_y), jeśli wartość col2_y jest w col1_y, czyli z tabeli chciałbym pozbyć się pierwszego wiersza (Y1, Y2), bo Y2 występuje dalej jako wartość w col1

0

musisz pewnie w pierwszym zapytaniu dać WHERE i podzapytanie zwracające pola z drugiej kolumny

0

Dało to taki sam efekt jak użycie with, chociaż nie rozwiązało wszystkiego do końca, ale teraz chciałbym zapytać: mając tabelę jak poprzednio

col1 col2
Y1 Y2
Y1 Y3
Y1 Y4
Y2 Y3
Y2 Y4
która jest wynikiem zapytania, jak mogę zliczyć dla każdej sekcji Y1, Y2 etc. (z col1), z iloma innymi należącymi do danej sekcji połączony jest każdy z jej składników (czyli np. dla sekcji Y1: z iloma należącymi do Y1 (col2) połączony jest Y2, Y3 i Y4), gdzie połączenia są zdefiniowane w osobnej tabeli o analogicznym wyglądzie, w formie par? Myślę o wybraniu każdej możliwej pary składników danej sekcji (czyli dla Y1: (Y2, Y3), (Y2, Y4), (Y3, Y4)) i sprawdzeniu istnienia takiej pary w tabeli związków. Nie wiem tylko, jak wybrać z zaprezentowanej tabeli, która jest wynikiem zapytania, wszelkie możliwe pary dla danej sekcji i potem każdemu składnikowi sekcji przyporządkować ilość związków z resztą składników sekcji.

Wynik zapytania wrzuciłem do tabeli tymczasowej, wydobyłem z niej pary składników należące do poszczególnych sekcji, ale niestety mam powtórzenia typu (Y2, Y3), a potem (Y3, Y2), których nie mogę się pozbyć. Wygląda to jak poniżej:

	select t1.col1, cast(t1.col2 as varchar)+cast(t2.col2 as varchar) as pat1, COUNT(*) as ile
		from @tempTable as t1, @tempTable as t2
		where ((t1.col2 <> t2.col2) and (t1.col1 = col1)
		--and (cast(t1.col2 as varchar)+cast(t2.col2 as varchar) <> cast(t2.col2 as varchar)+cast(t1.col2 as varchar)))
		group by t1.col1, t1.col2, t2.col2
1

Wytnij wyrażenie WITH i podstaw swoją tabelkę zamiast [MyTable]

WITH [MyTable] AS (
	SELECT [col1]='Y1', [col2]='Y2' UNION ALL
	SELECT [col1]='Y1', [col2]='Y3' UNION ALL
	SELECT [col1]='Y1', [col2]='Y4' UNION ALL
	SELECT [col1]='Y2', [col2]='Y3' UNION ALL
	SELECT [col1]='Y2', [col2]='Y4' 
)
SELECT 
	 T1.[col1]
	,T1.[col2]
FROM 
	[MyTable] T1
LEFT JOIN
	[MyTable] T2 ON T1.[col2] = T2.[col1]
WHERE
	T2.[col1] IS NULL
0

Zwróciło mi to zawartość tabeli tymczasowej. "col1" opisuje sekcję, do której należą składniki wymienione w "col2", każda sekcja ma kilka składników, a ja chciałbym stworzyć unikalne pary kombinacji tych składników (z "col2")

0

Napisałeś

I chce zapobiec wyświetlaniu par (col1_y, col2_y), jeśli wartość col2_y jest w col1_y, czyli z tabeli chciałbym pozbyć się pierwszego wiersza (Y1, Y2), bo Y2 występuje dalej jako wartość w col1

Czyli usuń te wiersze gdzie wartość kolumny 2 pojawia się gdzieś w kolumnie 1. To też jest w wyniku.

To co teraz napisałeś trochę rozjaśnia. Spróbuj:

WITH [MyTable] AS (
	SELECT [col1]='Y1', [col2]='Y2' UNION ALL
	SELECT [col1]='Y1', [col2]='Y3' UNION ALL
	SELECT [col1]='Y1', [col2]='Y4' UNION ALL
	SELECT [col1]='Y2', [col2]='Y3' UNION ALL
	SELECT [col1]='Y2', [col2]='Y4' 
)
SELECT DISTINCT
	 T1.[col2]
	,T2.[col2]
FROM 
	[MyTable] T1
INNER JOIN
	[MyTable] T2 ON T1.[col1] = T2.[col1]
WHERE 
	 T1.[col2] < T2.[col2]

To zapytanie tworzy wszystkie możliwe pary wartości z kolumny 2 w ramach zbiorów określonych przez kolumnę 1. DISTINCT wycina te same pary z różnych grup, a WHERE wycina symetryczność. Jeśli chcesz żeby relacje zwrotne pozostały zmień < na <=.

1

A i proszę testuj moje odpowiedzi na podanych przez Ciebie przykładach (u mnie w klauzuli WITH), żebyśmy mieli zgodność co do spodziewanego rezultatu.

Pozdrawiam.

0

Dokładnie o to chodziło, dziękuję. W poprzednim poście po zadaniu pytania udało mi się znaleźć odpowiedź i myślałem już o kolejnym kroku, ale wyjaśnienie pozostało dla poprzedniego, przepraszam za zamieszanie.

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