🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.bazy-danych
Article #195040

Re: Zapytanie eliminujące bez podzapytań (master-detail-detail)

#195040
From: tomek
Date: Thu, 14 Jul 2016 15:28
86 lines
3100 bytes
----- Original Message ----- 
From: "Roman Tyczka" <noemail@because.no>
Newsgroups: pl.comp.bazy-danych
Sent: Wednesday, July 13, 2016 3:22 PM
Subject: Zapytanie eliminujące bez podzapytań (master-detail-detail)


> Hi,
>
> Mam 3 tabelki w relacji master-detail-detail:
> RODZICE
> ID|  IMIE
> 1| MARIA
> 2| JAN
> 3| KATARZYNA
> 4| PIOTR
>
> DZIECI
> ID|   IMIE| ID RODZICA
> 1| JULKA | 1
> 2| ZOSIA | 1
> 3| HENIU | 2
> 4| ZUZIA | 3
> 5| VIOLA | 4
>
> ZABAWKI
> ID| NAZWA | ID DZIECKA
> 1| LALKA | 1
> 2| AUTKO | 2
> 3| KLOCKI| 3
> 4| PIŁKA | 4
> 5|   GRA | 5
> 6| PISTOL| 3
> 7| LALKA | 4
>
> Każde dziecko może mieć kilka zabawek, każdy rodzic kilkoro dzieci.
> Jak za pomocą jednego selecta wydobyć tylko tych rodziców, których dzieci
> nie mają określonych zabawek, np. lalki?
>
> Z powyższych danych zapytanie ma zwrócić tylko JANA i PIOTRA,  bo dziecko
> MARII oraz dziecko KATARZYNY mają lalkę.
>
> SELECT R.ID, R.IMIE FROM RODZICE R
> JOIN DZIECI D ON D.IDRODZICA = R.ID
> JOIN ZABAWKI Z ON Z.IDDZIECKA = D.ID
> WHERE  ???
>
> ps. umiem to zrobić z podzapytaniem w sekcji where, ale chciałbym się
> dowiedzieć czy można prościej



SELECT R.ID, R.IMIE, D.IMIE, Z.NAZWA
FROMRODZICE R
INNER JOIN DZIECI D
LEFT JOIN ZABAWKI Z ON Z.IDDZIECKA = D.ID AND Z.NAZWA = 'LALKA'
WHERE 1
AND D.IDRODZICA = R.ID

Otrzymasz listę par rodzic-dziecko gdzie w kolumnie Z.NAZWA czasem będzie 
LALKA a czasem NULL

-----------------------------------------------------------------------------------------------
Teraz można kombinować dalej (MYSQL)
i pogrupować po rodzicu:
(coś + NULL) => NULL

SELECT R.ID, R.IMIE, D.IMIE,
  CONCAT(Z.NAZWA) AS nazwaZabawki

FROM RODZICE R
INNER JOIN DZIECI D
LEFT JOIN ZABAWKI Z ON Z.IDDZIECKA = D.ID AND Z.NAZWA = 'LALKA'
WHERE 1
AND D.IDRODZICA = R.ID

GROUP BY R.ID
HAVING nazwaZabawki IS NULL

PS.
Pisane z głowy.
Być może zamiast CONCAT powinno byc coś lepszego do agregacji.

Pozdrawiam
Tomek
Technical Details
Message-ID: <5787af88$0$12558$65785112@news.neostrada.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
References: <swisjwkg9lsr.dlg@tyczka.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!agh.edu.pl!news.agh.edu.pl!newsfeed2.atman.pl!newsfeed.atman.pl!goblin2!goblin1!goblin.stu.neva.ru!newsfeed.neostrada.pl!unt-exc-01.news.neostrada.pl!unt-spo-a-01.news.neostrada.pl!news.neostrada.pl.POSTED!not-for-mail
From: "tomek" <skowtom@wp.xxx.pl>
Newsgroups: pl.comp.bazy-danych
References: <swisjwkg9lsr.dlg@tyczka.com>
Subject: Re: Zapytanie eliminujące bez
 podzapytań (master-detail-detail)
Date: Thu, 14 Jul 2016 17:28:07 +0200
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2900.5931
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.6157
X-RFC2646: Format=Flowed; Original
Lines: 95
Message-ID: <5787af88$0$12558$65785112@news.neostrada.pl>
Organization: Telekomunikacja Polska
NNTP-Posting-Host: 83.3.208.121
X-Trace: 1468510088 unt-rea-a-01.news.neostrada.pl 12558 83.3.208.121:1195
X-Complaints-To: abuse@news.neostrada.pl
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit