SQL:Наличие таблицы дважды в предложении FROM
-
22-09-2019 - |
Вопрос
Я использую MySQL.Вот моя схема:
Поставщики (сид:целое число, снэйм:строка, адресная строка)
Детали(пид:целое число, pname ( имя пользователя ):строка, цветная:строка)
Каталог(сид:целое число, pid:целое число, стоимость:настоящий)
(первичные ключи выделены жирным шрифтом)
Я пытаюсь написать запрос, который выбирает пары sid
которые поставляют одну и ту же деталь:
-- Find pairs of SIDs that both supply the same part
SELECT s1.sid, s2.sid
FROM Suppliers AS s1, Suppliers AS s2
JOIN Catalog ON s1.sid = Catalog.sid OR s2.sid = Catalog.sid;
MySQL выдает мне эту ошибку:
ОШИБКА 1054 (42S22):Неизвестный столбец "s1.sid" в предложении "on"
Что я делаю не так?
Решение
поиск запчастей у двух или более поставщиков:
select part_id
from catalog
group by part_id
having count(part_id) >= 2
найти поставщика (ов) этих запчастей, более перспективных, можно у двух или более поставщиков:
select c.part_id, s.supplier_name
from catalog c
join supplier s
where c.part_id in (
select part_id
from catalog
group by part_id
having count(part_id) >= 2)
order by c.part_id, s.supplier_name
но если вам нужны запчасти, у которых точно есть только два поставщика:
select c.part_id, group_concat(s.supplier_name) as suppliers
from catalog c
join supplier s using(supplier_id)
where part_id in (
select part_id
from catalog
group by part_id
having count(part_id) = 2)
group by c.part_id
если вы хотите, чтобы в двух столбцах отображались только эти два поставщика..я тоже думаю...:-)
[ОБНОВЛЕНИЕ]
то, что я придумал:
select c.part_id, c.min(c.supplier_id) as first, c.max(c.supplier_id) as second
from catalog c
join supplier s
where c.part_id in (
select part_id
from catalog
group by part_id
having count(part_id) = 2)
group by c.part_id
order by c.part_id
чтобы получить имена поставщиков:
select x.part_id, a.supplier_name, b.supplier_name from
(
select c.part_id, c.min(c.supplier_id) as first, c.max(c.supplier_id) as second
from catalog c
join supplier s
where c.part_id in (
select part_id
from catalog
group by part_id
having count(part_id) = 2)
group by c.part_id
order by c.part_id
) as x
join supplier a on x.first = a.sid
join supplier b on x.second = b.sid
Другие советы
Вы присоединяетесь к s2 и Каталогу.s1 не существует в этом предложении.
Вы смешиваете синтаксис соединения ANSI-89 и ANSI-92 - вы можете использовать только один или другой.ANSI-92:
SELECT s1.sid, s2.sid
FROM CATALOG c
LEFT JOIN SUPPLIERS s1 ON s1.sid = c.sid
LEFT JOIN SUPPLIERS s2 ON s2.sid = c.sid
Опустите LEFT
ключевое слово, если вы хотите видеть категории, связанные с двумя поставщиками.
Синтаксис ANSI-89 содержит все задействованные таблицы, объявленные в предложении FROM, соединения находятся в предложении WHERE.
Используйте ANSI-92 - смотрите Этот вопрос для получения подробной информации.
Я не понимаю сообщения об ошибке, но:
Я бы не стал использовать join в этом случае.Попробуй это
SELECT s1.sid, s2.sid
FROM suppliers s1,
suppliers s2,
catalog c1,
catalog c2
WHERE c1.pid = c2.pid
AND s1.sid = c1.sid
AND s2.sid = c2.sid
AND s1.sid < s2.sid
Хотя, поскольку все, о чем вы просите, - это sids, это может быть проще:
SELECT c1.sid, c2.sid
FROM catalog c1,
catalog c2
WHERE c1.pid = c2.pid
AND c1.sid < c2.sid
Я думаю, вам нужно явно объединить все таблицы, если вы будете использовать явные соединения.
например ,
-- Find pairs of SIDs that both supply the same part
SELECT
s1.sid,
s2.sid
FROM
Catalog
LEFT OUTER JOIN
Suppliers AS s1,
ON Catalog.sid = s1.sid
LEFT OUTER JOIN
Suppliers AS s2
ON Catalog.sid = s2.sid
Вам нужно объединить каталог с самим собой
SELECT
pid,
c1.sid,
c2.sid
FROM Catalog c1
JOIN Catalog c2 ON c1.pid = c2.pid AND c1.sid < c2.sid
< условие состоит в том, чтобы избегать пар (A поставляет тот же X, что и B, поэтому B поставляет тот же X, что и A).