3

如果这是一个愚蠢的问题,请原谅我,我对 PostgreSQL 不是很熟悉。

我从我所在地区的二手车经销商处收集了库存数据,并将其存储在 postgreSQL 表中。我有第二张表,其中包含有关某些品牌和型号的特定详细信息。例如:

经销商表的结构如下:

-----------------------------------------
| 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福特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_table1JOIN dealership_table dealership_table2设置了不同的“别名”,因此您可以在同一个查询中多次使用同一个表而不会出现名称冲突。)

于 2012-10-26T19:05:00.340 回答