繁体   English   中英

具有非唯一主键的MYSQL select语句

[英]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表没有唯一列。 这在您的应用程序世界中意味着什么?

  1. 这可能意味着一个特定的Make有一个以上的Bank ,让贷款,在这种情况下,有一些样的选择,或可替代的,嵌入在表中。

  2. 这可能意味着存在完全重复的行。

这是两种情况的示例。

|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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM