MS ACCESS 2010-尝试编写查询以避免链接表中的重复

问题描述

| 这是我的第一个问题,因此我将做得很透彻。忍受我。 我正在建立一个啤酒数据库,并创建了一个链接表,使我可以建议类似的啤酒(按口味或其他质量)。原始表使用BeerID作为主键,并且在链接表中,我通过两次加载BeerID从外键BeerID1和BeerID2创建了一个复合主键。到目前为止,它运行良好,但当我选择以下选项时: beerID1 = Dechutes IPA,beerID2 = Rogue IPA -然后在另一行中- beerID1 = Rogue IPA,beerID2 = Dechutes IPA 如您所见,我在重复数据方面遇到了问题,并且我对sql不太熟悉,无法深入了解如何解决此问题。外行可以使用的任何想法吗?我正在考虑某种形式的验证或查询...但是似乎无法走得太远。     

解决方法

        您实际上想再标准化一点。查看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
相反,您只希望有一列替代啤酒。在这种情况下,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
(当然,如果我们将所有这些正确地规范化了,由于啤酒和制造商之间存在多对一的关系,因此我们也将啤酒制造商分成了自己的表。)     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...