0

次の表を使用して、親とその保護者を返すクエリを作成したいと思います。私の質問は、personテーブルのname属性を2回使用して、介護者の名前と親の名前を返す方法です。サンプルコードをいただければ幸いです。私はそれをあまりよく説明していないことを知っていますが、誰かが私の意味を理解しているなら、上記を自由に編集してください。具体的には、personテーブルのみを使用して、親と子に関する情報を格納し、関連する各人の名前を表示します。単一のテーブルでこれを行うにはどうすればよいですか。

ここに画像の説明を入力してください

提供されたアドバイスを使用して、クエリを作成できましたが、テーブルに問題があるため、機能しません。私は次のテーブルを使用しています:

CREATE TABLE Person
(
personID INT NOT NULL,
name VARCHAR(50),
address VARCHAR(70),
phone VARCHAR(15),
email VARCHAR(30),
year INT,
PRIMARY KEY (personID)
);

CREATE TABLE Guardian
(
parentID INT NOT NULL,
childID INT NOT NULL,
PRIMARY KEY (parentID, childID)
FOREIGN KEY (parentID) REFERENCES (personID),
FOREIGN KEY (childID) REFERENCES (personID)
);

これを正しく機能させるには、どのステートメントを使用する必要がありますか。問題は、両方の外部キーステートメントがpersonテーブルの同じキーを参照していることだと思います。エラーが発生せずに親と子の両方を検索するときに同じ属性を参照するにはどうすればよいですか。

4

3 に答える 3

1
SELECT
    Child.name AS ChildName,
    Parent.name AS ParentName
FROM Guardian
    INNER JOIN Person AS Child ON Child.personID = Guardian.childID
    INNER JOIN Person AS Parent ON Parent.personID = Guardian.parentID

これにより、親子ペアごとに1行が返されます。

重要な機能は、Personテーブルを2回参照しますが、それぞれの場合に異なるエイリアス名を付けることです。次に、2つの異なる役割でそのテーブルを参照できます。出力列は、結合されたテーブルの2つのインスタンスから同じ列を区別するためにエイリアス化することもできます。

于 2012-05-24T09:04:37.527 に答える
0

あなたは言及しませんでしたが、人が保護者を1人しか持てないと仮定すると、2つのテーブルが必要だとは思いません。

自分自身にマップするPersonテーブルにguardianIDを追加するだけです。だからあなたはこのようなものを持っているでしょう

Person
ID   name        GuardianID
1    The Father     null
2    The Son         1

だからあなたが人とその保護者を知りたいならあなたはすることができます

select *, (select p2.name from person wherep2.id=p.guardianid)
from person p
where p.id=2
于 2012-05-24T09:03:06.203 に答える
0

まず、作成テーブルを修正します。

CREATE TABLE Guardian
(
parentID INT NOT NULL,
childID INT NOT NULL,
PRIMARY KEY (parentID, childID),
FOREIGN KEY (parentID) REFERENCES Person(personID),
FOREIGN KEY (childID) REFERENCES Person(personID)
);

次にクエリ:

SELECT
  p.name as parentName,
  c.name as childName,
  Guardian.*
FROM Person AS p
  INNER JOIN Guardian ON p.PersonID=Guardian.parentID
  INNER JOIN Person AS c ON c.PersonID=Guardian.childID
WHERE
  -- whatever you want, e.g.
  p.Name='John'
于 2012-05-24T09:03:42.887 に答える