0

次の例を考えます。

fav_colors
-----------------------
id   col1   col2   col3
-----------------------
01    01     03     03
02    04     02     01
03    01     03     02

colors
-----------
id   colors
-----------
01   green
02   red
03   blue
04   orange

colorsテーブル内の特定の ID の 3 色すべてから文字列値を取得するには、どのような SELECT ステートメントが機能しfav_colorsますか?

何かのようなもの:

SELECT col1, col2, col3
FROM fav_colors
INNER JOIN ?
WHERE fc.id = 03;

fav_color 配列を使用するとこれが簡単になると思いますが、これらの値が別々の列であることに依存しています。同じテーブルを別のテーブルの複数の列に結合するにはどうすればよいですか?

編集:以下のすべての回答は技術的に機能します。複数の色情報に大きく依存している場合は、各色を の参照行として記録する方がよいことに同意してくださいfav_colors。ありがとう!

4

3 に答える 3

4

異なる列への 3 つの結合でうまくいきます。

SELECT c1.colors AS c1, c2.colors AS c2, c3.colors AS c3
FROM fav_colors AS fc
INNER JOIN colors AS c1 on c1.id = fc.col1
INNER JOIN colors AS c2 on c2.id = fc.col2
INNER JOIN colors AS c3 on c3.id = fc.col3
WHERE fc.id = 03; 

これは非常に悪いテーブル設計であることに注意してください (まったくスケーラブルではありません)。

SQLFiddle: http://sqlfiddle.com/#!2/5b01b/6

于 2012-05-15T04:32:20.297 に答える
2

テーブルのエイリアス...

SELECT fc.id, fc.col1, c1.colors, fc.col2, c2.colors, fc.col3, c3.colors
  FROM fav_colors AS fc
  JOIN colors AS c1 ON fc.col1 = c1.id
  JOIN colors AS c2 ON fc.col2 = c2.id
  JOIN colors AS c3 ON fc.col3 = c3.id
 WHERE fc.id = 03;

理想的には、次のfav_colorsようなテーブルが必要です。

CREATE TABLE fav_colors
(
    id    INTEGER NOT NULL REFERENCES Users, -- Hypothetical table defining id values
    seq   INTEGER NOT NULL CHECK(seq BETWEEN 1 AND 3),
    color INTEGER NOT NULL REFERENCES Colors
    PRIMARY KEY(id, seq)
);

特定の DBMS では、その構文の一部を微調整する必要がある場合があります。

于 2012-05-15T04:31:48.133 に答える
1
SELECT (SELECT color FROM colors WHERE id = col1) AS color1,
(SELECT color FROM colors WHERE id = col2) AS color2,
(SELECT color FROM colors WHERE id = col3) AS color3
FROM fav_colors WHERE id = 03;

色テーブルの列名を色に変更します

于 2012-05-15T04:46:59.333 に答える