2011-06-01 37 views
1

這是我的第一個問題,所以我要非常徹底。忍受着我。MS ACCESS 2010 - 試圖編寫一個查詢以避免鏈接表中的重複

我正在爲啤酒建立一個數據庫,並創建了一個鏈接表,允許我建議類似的啤酒(無論是品嚐還是其他品質)。原始表使用beerID作爲主鍵,並且在鏈接表中,我通過在beerID中加載兩次來從外鍵beerID1和beerID2創建組合主鍵。它的工作很好,到目前爲止,除了當我選擇:

beerID1 = Dechutes IPA,beerID2 =流氓IPA

- 然後在另一行向

beerID1 =流氓IPA,beerID2 = Dechutes IPA

正如你所看到的,我有一個重複數據的問題,我對SQL不太熟悉,不知道如何解決這個問題。任何外行人都可以使用的想法?我正在考慮某種形式的驗證或查詢......但似乎無法導航得太遠。

回答

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 

相反,你要只有一個列備用啤酒。在這種情況下,AltBeer成爲

AltBeer 
AltBeerID BeerID AltBeer 
--------- ------ ------- 
1   1  3   
1   1  4   
2   2  5 
3   4  7 

然後做啤酒和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; 

的結果是這樣的(沒有DUP的,保證的廣告)

BeerName BeerManufacturer RecBeer  RecBeerMan 
-------- ---------------- -------  ----------- 
Beer1  BeerMan1   Beer3  BeerMan2 
Beer1  BeerMan1   Beer4  BeerMan3 

(當然,如果我們正確地將這一切正常化,我們還將啤酒製造商分成了自己的表格,因爲啤酒和製造商之間存在着多對一的關係。)