Warunkowe zwrócenie wartości z tabeli

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ę

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

w wyniku otrzymam

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ć

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

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:

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

inny zapis tego, ładniejszy i bardziej czytelny to

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.

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)

pole1 | pole2
10 | 1
10 | 2

Pozdrawiam
S.

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.

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

SELECT t1.pole1
FROM tabela t1
JOIN tabela t2 ON t2.pole1 = t1.pole1 AND t2.pole2 = 2
WHERE t1.pole2 = 1
SELECT t1.pole1
FROM tabela t1
JOIN tabela t2 ON t2.pole1 = t1.pole1
WHERE t1.pole2 = 1 AND t2.pole2 = 2
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
  )
6

Można też agregować

Select
    Pole1
From
    Tabela
Where 
    Pole2 in (1,2)
Group by
   Pole1
Having
   Count(distinct pole2) = 2
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.

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