这是我的第一个问题,所以我会非常彻底。忍受我。
我正在为啤酒建立一个数据库,并创建了一个链接表,允许我建议类似的啤酒(无论是品尝还是其他品质)。原始表使用beerID作为主键,在链接表中,我通过在beerID中加载两次,从外键beerID1和beerID2创建了一个复合主键。它到目前为止运作良好,除了我选择:
beerID1 = Dechutes IPA,beerID2 = Rogue IPA
- 然后在另一行 -
beerID1 = Rogue IPA,beerID2 = Dechutes IPA
正如您所看到的,我遇到了重复数据的问题,而且我对SQL不太熟悉,无法深入了解如何解决这个问题。外行人可以使用的任何想法?我正在考虑某种形式的验证或查询......但似乎无法导航太远。
答案 0 :(得分:0)
你实际上想要再多一点。查看http://en.wikipedia.org/wiki/First_normal_form
我认为你在做的是:
Beer
BeerID BeerName BeerManufacturer
------ -------- ----------------
1 Beer1 Brewer 1
2 Beer2 Brewer 1
3 Beer3 Brewer 2
4 Beer4 Brewer 3
AltBeer
AltBeerID BeerID BeerID1 BeerID2 BeerID3
--------- ------ ------- ------- -------
1 1 3 4
2 2 5
3 4 7
相反,您只想为Alternate Beers提供一列。在这种情况下,AltBeer变为
AltBeer
AltBeerID BeerID AltBeer
--------- ------ -------
1 1 3
1 1 4
2 2 5
3 4 7
然后在Beer和AltBeer(基于BeerID)上进行连接将为您提供与原始啤酒类似的BeersID列表。您可以再次加入啤酒(基于BeerID和AltBeer)来获取替代啤酒的详细信息
SELECT beer.beermanufacturer,
beer.beername,
beer_1.beername AS recbeer,
beer_1.beermanufacturer AS recbeerman
FROM (altbeer
INNER JOIN beer
ON altbeer.beerid = beer.beerid)
INNER JOIN beer AS beer_1
ON altbeer.altbeer = beer_1.beerid;
结果是这样的(没有重复,保证)
BeerName BeerManufacturer RecBeer RecBeerMan
-------- ---------------- ------- -----------
Beer1 BeerMan1 Beer3 BeerMan2
Beer1 BeerMan1 Beer4 BeerMan3
(当然,如果我们正确地将这一点正常化,我们也将啤酒制造商分成了自己的表,因为啤酒和制造商之间存在多对一的关系。)