SQL: наличие таблицы дважды в предложении FROM - PullRequest
0 голосов
/ 24 февраля 2010

Я использую MySQL. Вот моя схема:

Поставщики ( sid: целое число , sname: строка, строка адреса)

Детали ( pid: целое число , pname: строка, цвет: строка)

Каталог ( sid: целое число, 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' in 'on clause'

Что я делаю не так?

Ответы [ 6 ]

1 голос
/ 24 февраля 2010

Я не понимаю сообщение об ошибке, но:

В этом случае я бы не использовал 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
1 голос
/ 24 февраля 2010

Вы присоединяетесь к s2 и каталогу. s1 не существует в этом пункте.

1 голос
/ 24 февраля 2010

Вы смешиваете синтаксис ANSI-89 и ANSI-92 JOIN - вы можете использовать только один или другой. 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 - подробности см. В этом вопросе .

0 голосов
/ 24 февраля 2010

найти запчасти у двух или более поставщиков:

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

если вы хотите, чтобы только эти два поставщика отображались в двух столбцах ... я тоже думаю ...: -)

[UPDATE]

что я придумал:

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
0 голосов
/ 24 февраля 2010

Вам необходимо присоединиться к каталогу с собой

SELECT 
    pid, 
    c1.sid, 
    c2.sid
FROM Catalog c1
JOIN Catalog c2 ON c1.pid = c2.pid AND c1.sid < c2.sid

<условие - избегать пар (А поставляет тот же Х, что и В, поэтому В поставляет тот же Х, что и А) </p>

0 голосов
/ 24 февраля 2010

Я думаю, что вам нужно объединить все таблицы, если вы будете использовать явные объединения.

, например

-- 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 
...