--****************************************************************************
-- Welche Waren liefert Maier aus Königsbrunn?
--****************************************************************************

-- DISTINCT wegen verschiedener Lieferzeiten für dieselbe Ware/
SELECT DISTINCT w.wnr, w.typ, w.bezeichnung
FROM            KOWA.Haendler.haendler h,
                KOWA.Haendler.liefert l,
                KOWA.Haendler.ware w
WHERE           h.hnr = l.hnr and l.wnr = w.wnr
            AND h.name = 'Maier' AND h.adresse = 'Königsbrunn'
;

--****************************************************************************
-- Wer liefert welche Waren billiger als Maier aus Königsbrunn?
--****************************************************************************

--
-- Offene Frage: Wie soll verfahren werden, wenn Maier eine Ware zu zwei
-- verschiedenen Preisen (bei unterschiedlicher Lieferzeit) liefert
-- oder wenn dies für einen Konkurrenten gilt? Die folgende Lösung gibt alle
-- Varianten an, in denen jemand billiger als Maier aus Königsberunn liefert.
--

-- DISTINCT wegen verschiedener Lieferzeiten für dieselbe Ware 
SELECT DISTINCT h.hnr, h.name, h.adresse, 
                w.wnr, w.typ, w.bezeichnung, 
                l.preis, l.lieferzeit, 
                lm.preis as maierpreis, lm.lieferzeit as maierlieferzeit,
                lm.preis-l.preis as differenz

FROM            KOWA.Haendler.haendler hm, KOWA.Haendler.liefert lm,
                KOWA.Haendler.haendler h,  KOWA.Haendler.liefert l,
                KOWA.Haendler.ware w

WHERE           hm.hnr = lm.hnr
            AND h.hnr = l.hnr and l.wnr = w.wnr
            AND hm.name = 'Maier' AND hm.adresse = 'Königsbrunn'
            AND h.hnr <> hm.hnr
            AND l.wnr = lm.wnr
            AND l.preis < lm.preis
;

-- Alternative
SELECT DISTINCT anderer.hnr, anderer.name, anderer.adresse,
                anderer.wnr, anderer.typ, anderer.bezeichnung,
                anderer.preis, anderer.lieferzeit,
                maier.preis as maierpreis, anderer.lieferzeit as maierlieferzeit,
                maier.preis-anderer.preis as differenz

FROM            (SELECT * FROM 
                 KOWA.Haendler.haendler JOIN KOWA.Haendler.liefert USING (hnr)) AS maier,
                (SELECT * FROM 
                 KOWA.Haendler.haendler JOIN KOWA.Haendler.liefert l USING (hnr) 
                                        JOIN KOWA.Haendler.ware w USING (wnr)) AS anderer

WHERE           maier.name = 'Maier' AND maier.adresse = 'Königsbrunn'
            AND anderer.hnr <> maier.hnr
            AND anderer.wnr = maier.wnr
            AND anderer.preis < maier.preis
;


--****************************************************************************
-- Wer liefert welche Waren?
--****************************************************************************

-- DISTINCT wegen verschiedener Lieferzeiten für dieselbe Ware 
SELECT DISTINCT h.hnr, h.name, h.adresse, w.wnr, w.typ, w.bezeichnung
FROM            KOWA.Haendler.haendler h,
                KOWA.Haendler.liefert l,
                KOWA.Haendler.ware w
WHERE           h.hnr = l.hnr and l.wnr = w.wnr
;

-- aber 

SELECT h.hnr, h.name, h.adresse, l.preis, l.lieferzeit, w.wnr, w.typ, w.bezeichnung
FROM   KOWA.Haendler.haendler h, KOWA.Haendler.liefert l, KOWA.Haendler.ware w
WHERE  h.hnr = l.hnr and l.wnr = w.wnr
;


-- Natural Join

SELECT DISTINCT h.hnr, h.name, h.adresse, w.wnr, w.typ, w.bezeichnung
FROM            KOWA.Haendler.haendler h JOIN KOWA.Haendler.liefert l USING (hnr) 
                                         JOIN KOWA.Haendler.ware w USING (wnr)
;

SELECT h.hnr, h.name, h.adresse, l.preis, l.lieferzeit, w.wnr, w.typ, w.bezeichnung
FROM   KOWA.Haendler.haendler h JOIN KOWA.Haendler.liefert l USING (hnr) 
                                JOIN KOWA.Haendler.ware w USING (wnr)
;


-- Predicate Join 

SELECT DISTINCT h.hnr, h.name, h.adresse, w.wnr, w.typ, w.bezeichnung
FROM            (KOWA.Haendler.haendler h JOIN KOWA.Haendler.liefert l ON (h.hnr = l.hnr)) 
                                          JOIN KOWA.Haendler.ware w ON (l.wnr = w.wnr)
;

SELECT h.hnr, h.name, h.adresse, l.preis, l.lieferzeit, w.wnr, w.typ, w.bezeichnung
FROM   (KOWA.Haendler.haendler h JOIN KOWA.Haendler.liefert l ON (h.hnr = l.hnr)) 
                                 JOIN KOWA.Haendler.ware w ON (l.wnr = w.wnr)
;


--****************************************************************************
-- Outer Joins                                                               
--****************************************************************************

SELECT DISTINCT h.hnr, h.name, h.adresse, w.typ
FROM            KOWA.Haendler.haendler h JOIN KOWA.Haendler.liefert l USING (hnr)
                                         JOIN KOWA.Haendler.ware w    USING (wnr)
;

SELECT DISTINCT h.hnr, h.name, h.adresse, w.typ
FROM            KOWA.Haendler.haendler h LEFT JOIN KOWA.Haendler.liefert l USING (hnr)
                                         LEFT JOIN KOWA.Haendler.ware w    USING (wnr)
;

SELECT DISTINCT h.hnr, h.name, h.adresse, w.typ
FROM            KOWA.Haendler.haendler h LEFT JOIN KOWA.Haendler.liefert l ON h.hnr = l.hnr
                                         LEFT JOIN KOWA.Haendler.ware w    ON l.wnr = w.wnr
;

