MS ACCESS 2010 - попытка написать запрос, чтобы избежать дублирования в таблице ссылок - PullRequest
1 голос
/ 01 июня 2011

Это мой первый вопрос, поэтому я собираюсь быть очень тщательным. Потерпи меня.

Я создаю базу данных для пива и создал таблицу ссылок, которая позволяет мне предлагать аналогичные сорта пива (либо по вкусу, либо по другому качеству). Исходная таблица использует beerID в качестве первичного ключа, и в таблице связывания я создал составной первичный ключ из внешних ключей beerID1 и beerID2, дважды загрузив beerID. Пока все работает хорошо, за исключением того, что когда я выбираю:

beerID1 = Dechutes IPA, beerID2 = Rogue IPA

- а затем в другом ряду -

beerID1 = Rogue IPA, beerID2 = Dechutes IPA

Как видите, у меня проблема с дублирующимися данными, и я не слишком знаком с SQL, чтобы разобраться в том, как это исправить. Любые идеи, которые может использовать дилетант? Я думаю о какой-то форме проверки или запроса ... но, похоже, не могу пройти слишком далеко.

1 Ответ

0 голосов
/ 02 июня 2011

Вы действительно хотите нормализовать это немного больше.Проверьте 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, которые похожи на исходное пиво.Вы можете узнать подробности об альтернативных сортах пива, снова присоединившись к Beer (на основе 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

(Конечно, если бы мы все правильно нормализовали, мы бы также разделили производителя пива на его собственную таблицу, поскольку между пивом и производителем существует отношение многие к одному.)

...