Warunkowe zwrócenie wartości z tabeli

Warunkowe zwrócenie wartości z tabeli
S0
  • Rejestracja: dni
  • Ostatnio: dni
0

Witajcie,
Do tej pory korzystałem z SQL-a wykorzystując zapytania SELECT, ale problem który napotkałem przerósł mnie - nic dziwnego skoro jestem początkujący.

Otóż ma tabelę z dwoma polami: pole1 i pole2

pole1 pole2
10 1
10 2
11 1
11 3
12 1
12 4

i teraz jeżeli chciałbym wybrać te rekordy (pole1), które w pole2 mają wartość 1 lub 2 to napiszę

Kopiuj
SELECT pole1 FROM tabela WHERE (pole1 = 1) OR (pole1=2)

w wyniku otrzymam

Kopiuj
10   
10   
11   
12

A co jeżeli chciałbym wybrać te rekordy(pole1) , które w pole2 mają wartość 1 i 2, tak aby otrzymać tylko rekord (pole1) = 10?
To jak mam to napisać zapytanie?
Nie mogę napisać

Kopiuj
SELECT pole1 FROM tabela WHERE (pole1 = 1) AND (pole1=2) 

bo oczywiście takie zapytanie zwróci mi pusty wynik.

Mam nadzieję, że dobrze wyjaśniłem mój problem.

Pozdrawiam
Sc0li0sis

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
2

W SQL są kolumny nie pola.
Warunek możesz składać dowolnie na dowolne kolumny.
W zapytaniach niesty sam chyba pomyliłeś nazwy kolumn. Chyba chodzi Ci o coś takiego:

Kopiuj
SELECT pole1 FROM tabela WHERE ((pole2=1) OR (pole2=2)) AND pole1 = 10

inny zapis tego, ładniejszy i bardziej czytelny to

Kopiuj
SELECT pole1 FROM tabela WHERE pole2 in (1,2) AND pole1 = 10

no i z przykładu masz jakby użycie distinct czego w przykładowym zapytaniu nie ma.

S0
  • Rejestracja: dni
  • Ostatnio: dni
0

Może źle cos opisałem, jeżeli tak, to przepraszam.
Sorry także za pole, oczywiście powinno być kolumny :(

pole1=10 to jest WYNIK, a nie część zapytania
W tabeli mam tylko jedna wartość w pole1 spełniająca taki warunek że pole2=1, i pole2=2 (oczywiście w dwóch różnych wierszach)

Kopiuj
pole1 | pole2
10 | 1
10 | 2

Pozdrawiam
S.

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3581
0

Dodatkowym warunkiem jest właśnie to co opisałeś że wartość kolumny pole1 musi być 10.
Edit @Sc0li0sis
Tobie chyba chodzi o wykonanie czegoś ala PIVOT.
Zoabacz tutaj:
https://pl.seequality.net/pivot-tsql-metody/
Pamiętaj, że to dla MSSQL serwer ale poprzez Join i GroupBy uzyskasz to czego oczekujesz.

FA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 218
4

Bo Ty nie szukasz rekordów, które mają pole2=1 i pole2=2.
Ty szukasz wyłącznie rekordów, które mają pole2=1, a przy tym istnieje inny rekord, który ma taką samą wartość w pole1 i pole2=2

Wszystkie poniższe dadzą ten sam rezultat

Kopiuj
SELECT t1.pole1
FROM tabela t1
JOIN tabela t2 ON t2.pole1 = t1.pole1 AND t2.pole2 = 2
WHERE t1.pole2 = 1
Kopiuj
SELECT t1.pole1
FROM tabela t1
JOIN tabela t2 ON t2.pole1 = t1.pole1
WHERE t1.pole2 = 1 AND t2.pole2 = 2
Kopiuj
SELECT t1.pole1
FROM tabela t1
WHERE t1.pole2 = 1
  AND EXISTS(
    SELECT *
    FROM tabela t2
    WHERE t2.pole1 = t1.pole1
      AND t2.pole2 = 2
  )
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3891
6

Można też agregować

Kopiuj
Select
    Pole1
From
    Tabela
Where 
    Pole2 in (1,2)
Group by
   Pole1
Having
   Count(distinct pole2) = 2
S0
  • Rejestracja: dni
  • Ostatnio: dni
0

Bardzo dziękuję wszystkim za pomoc
Problem rozwiązany.
Analizując Wasze podpowiedzi dużo się nauczyłem.
Ostatecznie zastosowałem rozwiązanie Panczo. Jest ono dla mnie najbardziej czytelne.
S.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.