0

私はMySQLを使用しています。ここに私のスキーマがあります:

サプライヤー ( sid: 整数、sname: 文字列、アドレス文字列)

パーツ ( pid: 整数、pname: 文字列、色: 文字列)

Catalog( 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): 'on 句' の列 's1.sid' が不明です

私は何を間違っていますか?

4

6 に答える 6

1

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

LEFT2 つのサプライヤーが関連付けられているカテゴリを表示する場合は、キーワードを省略します。

ANSI-89 構文では、関連するすべてのテーブルが FROM 句で宣言され、結合は WHERE 句で行われます。

ANSI-92 を使用します。詳細については、この質問を参照してください

于 2010-02-23T22:55:42.853 に答える
1

s2 と Catalog に参加しています。s1 はその句に存在しません。

于 2010-02-23T22:56:17.907 に答える
1

エラーメッセージはわかりませんが、次のとおりです。

この場合、結合の使用は避けます。これを試して

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

あなたが求めているのはsidだけなので、もっと簡単にすることができます:

SELECT c1.sid, c2.sid
FROM catalog   c1,
     catalog   c2
WHERE c1.pid = c2.pid
AND   c1.sid < c2.sid
于 2010-02-23T23:01:33.653 に答える
0

2 つ以上のサプライヤーの部品を検索:

select part_id
from catalog 
group by part_id
having count(part_id) >= 2

それらの部品のサプライヤーを見つけて、より将来性のある、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

ただし、正確に2つのサプライヤーしか持たない部品が必要な場合:

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

これらの 2 つのサプライヤーのみを 2 つの列に表示したい場合.. 私も考えています... :-)

[アップデート]

私が考えたこと:

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
于 2010-02-24T00:08:21.500 に答える
0

明示的な結合を使用する場合は、すべてのテーブルを明示的に結合する必要があると思います。

例えば

-- 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 
于 2010-02-23T22:58:37.183 に答える
0

カタログをそれ自体と結合する必要があります

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

< 条件はペアを避けることです (A が B と同じ X を供給するので、B は A と同じ X を供給します)

于 2010-02-23T23:04:47.057 に答える