Как выбрать 2 значения одного и того же атрибута в SQL - PullRequest
1 голос
/ 09 июля 2019

У меня есть 3 разных таблицы, которые содержат:

suppliers (sid; sname; adress)
parts(pid; pname; color)
catalog (sid; pid; cost)

Теперь я должен получить SID поставщиков, которые поставляют красную часть и зеленую часть.

И результат должен быть следующим:

SID      Color1      Color2
---      ---------   ------
S1       green       red

Я не понимаю, что мне нужно делать, чтобы выбрать 2 значения одного и того же атрибута Color. Нужно ли использовать подзапрос?

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

чтобы получить два столбца , вам нужно дважды присоединиться к таблице продуктов. Хотя это работает, оно не масштабируется (представьте, что вам нужно расширить до 10 разных цветов ...).

Таким образом, приведенный выше ответ Гордона Линоффа работает и будет возвращать каждый цвет в отдельном ряду с одинаковым sid, вот так:

SID  Color
---  -----
S1   red
S1   green

чтобы получить его в два столбца (если вы действительно хотите это сделать):

SELECT s.sid, p1.color, p2.color
FROM suppliers s
JOIN cataglog c ON c.sid=s.sid
JOIN products p1 ON p1.pid=c.pid
LEFT JOIN products p2 ON p2.pid=c.pid AND p2.color != p1.color
GROUP BY s.sid

СЛЕВА СОЕДИНЯЙТЕСЬ ко второй таблице продуктов, если нет вторичного цвета.

Опять же, это уродливо и не масштабируется, я бы предложил использовать многорядное решение.

0 голосов
/ 09 июля 2019

Вы можете использовать агрегацию и предложение having:

select s.sid
from suppliers s join
     catalog c
     on s.sid = c.sid join
     products p
     on c.pid = p.id
where p.color in ('green', 'red')
group by s.id
having count(distinct p.color) = 2;
...