PostgreSQL内部加入同一个表+第二个表?

时间:2012-10-26 18:46:03

标签: sql postgresql

如果这是一个愚蠢的问题,原谅我,我对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菜鸟。

我做错了什么?我应该如何检索所需的结果?非常感谢任何建议,解决方案或建议!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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设置了不同的“别名”,因此您可以在同一个查询中多次使用同一个表,而不会出现名称冲突。)