如果这是一个愚蠢的问题,原谅我,我对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菜鸟。
我做错了什么?我应该如何检索所需的结果?非常感谢任何建议,解决方案或建议!
答案 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_table1
和JOIN dealership_table dealership_table2
设置了不同的“别名”,因此您可以在同一个查询中多次使用同一个表,而不会出现名称冲突。)