3

これがばかげた質問である場合は、許してください。私は PostgreSQL にあまり詳しくありません。

私の地域の中古車販売店から在庫データを収集し、postgreSQL テーブルに保存しました。特定のメーカーとモデルに関する特定の詳細が記載された 2 番目の表があります。例えば:

ディーラーテーブルは次のように構成されています。

-----------------------------------------
| Dealership | Make | Model | Year | ID |
----------------------------------------|
|     A      | Ford | F250  | 2003 |  1 |
|     A      | Chevy| Cobalt| 2005 |  2 |
|     B      | Ford | F250  | 2003 |  1 |
|     B      | Dodge| Chrgr | 2012 |  3 |
-----------------------------------------

詳細テーブルは次のように構成されています。

-----------------------------------------
|     ID     | DetailA| DetailB| DetailC|
-----------------------------------------
|     1      |  data  |  data  |  data  |
|     2      |  data  |  data  |  data  |
|     3      |  data  |  data  |  data  |
|     4      |  data  |  data  |  data  |
-----------------------------------------

私の目標は、複数のディーラーから一致する車両を取得し、適切な詳細を表示することです。上記の例では、次のことを確認したいと思います。

-----------------------------------------------------
| Make | Model | Year | DetailA | DetailB | DetailC |
-----------------------------------------------------
| Ford | F250  | 2003 |   data  |  data   |  data   |
-----------------------------------------------------

この結果により、A と B の両方が 2003 年の Ford F250 を販売していることがわかります。また、車両の関連する詳細を表示できます。

私はさまざまなクエリを試しましたが、ほとんどは次のようなバリエーションです。

SELECT DISTINCT
    dealership_table.make,
    dealership_table.model,
    dealership_table.year
            details_table.detaila,
            details_table.detailb,
            details_table.detailc
FROM
    dealership_table
INNER JOIN
    details_table
    ON
    dealership_table.id = details_table.id
WHERE
     dealership_table.dealership = 'A'
     OR
     dealership_table.dealership = 'B'

ただし、これは、ディーラーが A または B のいずれかであるテーブルからのすべての個別の一致を返します。複数の内部結合を試しましたが、エラーを訴えるエラーdetails_tableが複数回指定されています。

私が本当にばかげたことをしているなら、私は謝ります。前にも言ったように、私はほとんど SQL 初心者です。

私は何を間違っていますか?目的の結果を取得するにはどうすればよいですか? 提案、解決策、またはアドバイスは大歓迎です!

4

2 に答える 2

4

テーブルのレイアウトを誤解しているかもしれませんが、別の構造に変更することを検討する必要があると思います。これが私が提案するものです:

車両

----------------------------
| ID | Make | Model | Year |
----------------------------
| 1  | Ford | F250  | 2003 |
| 2  | Chevy| Cobalt| 2005 |
| 3  | Dodge| Chrgr | 2012 |
----------------------------

ディーラー

----------------------------
| Dealership | ID | Detail |
----------------------------
|     A      |  1 |  data  |
|     A      |  2 |  data  |
|     B      |  1 |  data  |
|     B      |  3 |  data  |
----------------------------

このようにして、車両情報(メーカー/モデル/年)を複数の場所に保存することはありません。

上記のスキーマを前提として、目的のクエリを作成する方法は次のとおりです。

SELECT Make, Model, Year, A.Detail, B.Detail, C.Detail
FROM Vehicle V
LEFT OUTER JOIN Dealership A on A.Dealership = 'A' and A.id = V.id
LEFT OUTER JOIN Dealership B on B.Dealership = 'B' and B.id = V.id
LEFT OUTER JOIN Dealership C on C.Dealership = 'C' and C.id = V.id
于 2012-10-26T19:00:39.440 に答える
4

あなたは書ける:

SELECT dealership_table1.make,
       dealership_table1.model,
       dealership_table1.year,
       details_table.detaila,
       details_table.detailb,
       details_table.detailc
  FROM dealership_table dealership_table1
  JOIN dealership_table dealership_table2
    ON dealership_table1.make  = dealership_table2.make
   AND dealership_table1.model = dealership_table2.model
   AND dealership_table1.year  = dealership_table2.year
  JOIN details_table
    ON dealership_table.id = details_table.id
 WHERE dealership_table1.dealership = 'A'
   AND dealership_table1.dealership = 'B'
;

FROM dealership_table dealership_table1( と は別個の「エイリアス」をJOIN dealership_table dealership_table2設定することに注意してください。そのため、同じクエリで同じテーブルを複数回使用しても、名前の競合が発生することはありません。)

于 2012-10-26T19:05:00.340 に答える