[英]MYSQL select statement with non unique primary key
|Vin |Make |Year|
| 1 |Honda|2009|
| 2 |Honda|2010|
| 3 |Honda|2009|
| 4 |Toyota|2009|
|Color|Make |Vin|
| Red |Honda|1|
|Blue |Toyota|4|
|Pink |Honda|2|
|Bank|Make |
| BOA |Honda|
| Cha |Toyota|
| PNC |Jeep|
SELECT
car.Vin,
colors.Color,
financer.Bank
from Car
JOIN Colors ON car.vin = colors.vin
AND car.make = colors.make
JOIN financer ON car.make = financer.make
WHERE car.make = 'Honda'
尝试联接这些表,但获得的行比预期的多。 我上面的financer
表没有唯一的列。
有没有一种方法可以使ALTER TABLE通过合并2列来使主键唯一?
让我们从RDBMS详细信息中退后一步,考虑一下这意味着您的financer
表没有唯一列。 这在您的应用程序世界中意味着什么?
这可能意味着一个特定的Make
有一个以上的Bank
,让贷款,在这种情况下,有一些样的选择,或可替代的,嵌入在表中。
这可能意味着存在完全重复的行。
这是两种情况的示例。
|Bank |Make |
| BOA |Honda |
| TD |Honda | 1. more than one bank finances Honda
| Cha |Toyota |
| PNC |Jeep |
| PNC |Jeep | 2. entirely duplicate row
此版本的financer
表生成此结果集( http://sqlfiddle.com/#!9/27705/2/0 )。 正如您提到的那样,它有很多重复项
| Vin | Color | Bank |
|-----|-------|------|
| 1 | Red | BOA |
| 2 | Pink | BOA |
| 1 | Red | TD |
| 2 | Pink | TD |
| 4 | Blue | Cha |
您可以通过创建由两列组成的复合主键来防止完全重复的行。 在您的应用程序世界中,这可能很有意义。
如果需要1 :: 1的关系Make :: Bank,可以在Make上放置一个主键。 但是我怀疑这不会正确地模拟您的应用程序的世界。 ( http://sqlfiddle.com/#!9/27705/5/0 )
也许您想要此查询:
SELECT cars.Vin, cars.Make,
GROUP_CONCAT(DISTINCT colors.Color) Colors,
GROUP_CONCAT(DISTINCT financer.Bank) Banks
from Cars
JOIN Colors ON cars.vin = colors.vin
AND cars.make = colors.make
JOIN financer ON cars.make = financer.make
GROUP BY cars.Make, cars.vin
GROUP_CONCAT()
和GROUP BY
这种组合产生了每辆汽车的匹配颜色列表和匹配库列表。
| Vin | Make | Colors | Banks |
|-----|--------|--------|--------|
| 1 | Honda | Red | TD,BOA |
| 2 | Honda | Pink | TD,BOA |
| 4 | Toyota | Blue | Cha |
如您所见,每辆本田汽车都有两个银行清单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.