1

複数のサブクエリなしでこれをクエリする良い方法がわかりません。テーブルを再構築することはできないので、それはオプションではありません。セットアップは次のとおりです。

person:
person_id
person_want_id,
person_need_id,
person_ability_id,
person_willingness_id

person_status_types:
status_type_id
status_type_name

個人の ID のそれぞれは、タイプ person_status_types です。私が引き出す必要があるのは、各 ID の status_type_name です。

したがって、return ステートメントは次のようになります。

person_id | person_want_name | person_need_name | person_ability_name | person_willingness_name

現在、私は 4 つのサブクエリを実行していますが、よりクリーンな方法が必要です。また、より良いデータベース構造について言及したい場合は、将来のデータベース作成のためにオープンマインドです。

4

3 に答える 3

4
SELECT p.person_id
      ,want.status_type_name AS person_want_name
      ,need.status_type_name AS person_need_name
      ,abt.status_type_name  AS person_ability_name
      ,wil.status_type_name  AS person_willingness_name
FROM person p
LEFT JOIN person_status_types want ON p.person_want_id = want.status_type_id
LEFT JOIN person_status_types need ON p.person_need_id = need.status_type_id
LEFT JOIN person_status_types abt  ON p.person_ability_id = abt.status_type_id
LEFT JOIN person_status_types wil ON p.person_willingness_id = wil.status_type_id

LEFT JOIN行が失われないようにするために使用します。
また、識別子を単一引用符で囲むことはできません (別の回答が示唆するように)。一重引用符は値です。

識別子の区切り文字

これはいくつかの議論を引き起こしたので、明確にするために:

  • 二重引用符は 、ANSI 標準に従って識別子"を区切ります。これは、重要なすべての RDBMS で広くサポートされていますが、MySQL は唯一の例外ですMySQLでこれを修正するにはSET sql_mode = 'ANSI';

    []一部の RDBMS は、SQL サーバーなどの追加の代替区切り文字を受け入れます。

  • 一重引用符は 、ANSI 標準に従って'を区切ります。一部の RDBMS (MySQL や SQL Server など) では、一般的な文字列区切り文字として列名の周りにそれらを許容します。ただし、どちらもテーブル名の周りでそれらを受け入れません。

  • ´識別子の区切り文字としてのバッククォートは、MySQL の奇妙な点です。繰り返しますが、MySQL でこれを修正するには、SET sql_mode = 'ANSI';

以下は、データベースとそれぞれの識別子の区切り文字のリストです

于 2012-11-01T23:16:31.840 に答える
1

サブクエリを実行する必要はありません。JOIN を実行するだけです。

SELECT p.person_id, 
    want.status_type_name AS "person_want_name", 
    need.status_type_name AS "person_need_name", 
    ability.status_type_name AS "person_ability_name", 
    willingness.status_type_name AS "person_willingness_name"
FROM person p
JOIN person_status_types want ON p.person_want_id = want.status_type_id
JOIN person_status_types need ON p.person_need_id = need.status_type_id
JOIN person_status_types ability ON p.person_ability_id = ability.status_type_id
JOIN person_status_types willingness ON p.person_willingness_id = willingness.status_type_id

テーブル エイリアスは、参照しているテーブルの「コピー」を区別するのに役立ち、それぞれが とは異なる列で結合されていることに注意してくださいperson

編集: コメントは、PostgreSQL が ANSI に一致する列エイリアスの単一引用符を許可しないことを示しています。MySQL と SQL Server がサポートしているので、驚いたと思います。私のクエリは修正されました。

于 2012-11-01T23:12:28.790 に答える
0

次のようなことを試してください:

SELECT person_id, st1.status_type_name AS want, st2.status_type_name AS need, st3.status_type_name AS ability, st4.status_type_name AS willingness
FROM person p
LEFT OUTER JOIN person_status_types st1 ON p.person_want_id=st1.status_type_id
LEFT OUTER JOIN person_status_types st2 ON p.person_need_id=st2.status_type_id
LEFT OUTER JOIN person_status_types st3 ON p.person_ability_id=st3.status_type_id
LEFT OUTER JOIN person_status_types st4 ON p.person_willingness_id=st4.status_type_id;
于 2012-11-01T23:17:58.477 に答える