1. ホーム
  2. sql

[解決済み] SQL:サブクエリにカラムが多すぎる

2022-03-04 22:02:29

質問

Postgresqlでクエリを作成しようとしています。 データベースには2つの関係があります:"kingdom"はイギリスの王を含み、"dinasty"はstuart dinastyの人物を含みます。

kingdom" 関係は、王の名前と、その王国がいつ始まりいつ終わったかを含んでいる。dinasty"は、名前、性別、出生、死亡を含む。

私が照会しようとしているのは、死亡したときに最も年上だった王です。

私のクエリでは、LINE 3 (NOT IN)でこのようなエラーが発生します。 subquery has too many columns

これがクエリです。

SELECT kingdom.king, dinasty.birth, dinasty.death
FROM kingdom, dinasty
WHERE kingdom.king = dinasty.name AND kingdom.king NOT IN
(
    SELECT DISTINCT R1.king, R1.birth, R1.death
    FROM
    (
        SELECT DISTINCT R1.king, D1.birth, D1.death
        FROM kingdom AS R1, dinasty AS D1, dinasty AS D2
        WHERE R1.king=D1.name
    ) AS R1, 
    (
        SELECT DISTINCT R1.king, D1.birth, D1.death
        FROM kingdom AS R1, dinasty AS D1, dinasty AS D2
        WHERE R1.king=D1.name
    ) AS R2
    WHERE R1.death-R1.birth < R2.death-R2.birth
);

NOT INの中身は正しいです。

どのように解決するのですか?

投影している カラムの比較は、サブクエリ内の単一の 一つ の中で、それらの IN 節を使用します。必要なカラムだけを選択する ( r1.king に対して IN をサブクエリに追加します。

SELECT kingdom.king, dinasty.birth, dinasty.death
FROM kingdom, dinasty
WHERE kingdom.king = dinasty.name AND kingdom.king NOT IN
(
    SELECT DISTINCT R1.king
    FROM
    (
        SELECT DISTINCT R1.king, D1.birth, D1.death
        FROM kingdom AS R1, dinasty AS D1, dinasty AS D2
        WHERE R1.king=D1.name
    ) AS R1, 
    (
        SELECT DISTINCT R1.king, D1.birth, D1.death
        FROM kingdom AS R1, dinasty AS D1, dinasty AS D2
        WHERE R1.king=D1.name
    ) AS R2
    WHERE R1.death-R1.birth < R2.death-R2.birth
);