[[ $1 =~ ^.+\.[[:alnum:]]+$ ]]
|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'
表没有唯一的列。
有没有办法可以通过组合2列来使用ALTER TABLE来使主键唯一?
答案 0 :(得分:0)
让我们从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 |
如您所见,每辆本田汽车都有两个银行的清单。