Gistrec icon

DB lab 3

Gistrec | PRO | 10/07/19 04:33:57 AM UTC | 0 ⭐ | 7305 👁️ | Never ⏰ | []
PostgreSQL |

2.86 KB

|

None

|

0 👍

/

0 👎

SELECT CONCAT('Город ', LOWER(s.town), ': ', UPPER(s.name), '(', s.reiting, ')') FROM s
 
 
 
# 1. Получаем множество поставщиков, выполнивших поставки из Рима
#        SELECT DISTINCT s.n_post
#        FROM s
#        JOIN spj ON s.n_post = spj.n_post
#        JOIN p   ON p.n_det  = spj.n_det
#        WHERE p.town = 'Рим'
#
# 2. Считаем сколько поставщиков в заданном множестве (т.е. поставляли детали из рима)
# Просто добавляем COUNT
#        SELECT p.n_izd, COUNT(DISTINCT s.n_post)
#        FROM s
#        JOIN spj ON s.n_post = spj.n_post
#        JOIN p   ON p.n_det  = spj.n_det
#        WHERE p.town = 'Рим'
# Получили информацию о том, что детали из Рима поставляли 4 поставщика
#
# 3. Находим номера деталей, которые поставлял хотя бы один поставщик из пункта 1)
#    (Потом для этих деталей подсчитаем кол-во поставщиков и добавим условие HAVING COUNT = 4)
#SELECT DISTINCT p.n_det
#FROM p
#JOIN spj ON p.n_det = spj.n_det
#WHERE spj.n_post IN (
#    SELECT DISTINCT s.n_post
#    FROM s
#    JOIN spj ON s.n_post = spj.n_post
#    JOIN p   ON p.n_det  = spj.n_det
#    WHERE p.town = 'Рим')
# Получили все детали
#
# 4. Получаем количество поставщиков, которые поставляли каждую деталь (из пункта выше)
#    Просто добавляем COUNT и GROUP BY
#SELECT p.n_det, COUNT(DISTINCT spj.n_post) AS count
#FROM p
#JOIN spj ON p.n_det = spj.n_det
#WHERE spj.n_post IN (
#    SELECT DISTINCT s.n_post
#    FROM s
#    JOIN spj ON s.n_post = spj.n_post
#    JOIN p   ON p.n_det  = spj.n_det
#    WHERE p.town = 'Рим')
#GROUP BY p.n_det
#
# 5. Добавляем условие: чтобы кол-во из п. 4 было равно кол-во из п. 2
SELECT p.n_det
FROM p
JOIN spj ON p.n_det = spj.n_det
WHERE spj.n_post IN (
    SELECT DISTINCT s.n_post
    FROM s
    JOIN spj ON s.n_post = spj.n_post
    JOIN p   ON p.n_det  = spj.n_det
    WHERE p.town = 'Рим')
GROUP BY p.n_det
HAVING COUNT(DISTINCT spj.n_post)=(
    SELECT COUNT(DISTINCT spj.n_post)
    FROM p
    JOIN spj ON p.n_det = spj.n_det
    WHERE spj.n_post IN (
        SELECT DISTINCT s.n_post
        FROM s
        JOIN spj ON s.n_post = spj.n_post
        JOIN p   ON p.n_det  = spj.n_det
        WHERE p.town = 'Рим')
    )
ORDER BY p.n_det
 
 
SELECT CONCAT('Город ', LOWER(s.town), ': ', UPPER(s.name), '(', s.reiting, ')') FROM "pmib6104".s

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎

    
        
  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎