2014-06-09 49 views
0

我有這三個表:SQLite的select語句翻出所有值雖然它不應該

CREATE TABLE "item" (
    "itemID" INTEGER PRIMARY KEY , 
    "itemName" VARCHAR(25), 
    buyerID INTEGER REFERENCES buyer(buyerID), 
    sellerID INTEGER REFERENCES seller(sellerID) 
); 

CREATE TABLE buyer(
    buyerID INTEGER PRIMARY KEY UNIQUE NOT NULL, 
    fname VARCHAR(25), 
    lname VARCHAR(25), 
    itemID INTEGER, 
    FOREIGN KEY (itemID) REFERENCES item(itemID) 
); 

CREATE TABLE seller(
    sellerID INTEGER PRIMARY KEY UNIQUE NOT NULL, 
    fname VARCHAR(25), 
    lname VARCHAR(25), 
    itemID INTEGER, 
    FOREIGN KEY (itemID) REFERENCES item(itemID) 
); 

Item table has: 
1|Poly|1|1 
2|Jute|2|2 
3|Salt|3|3 

Buyer Table has: 
1|Buyer1|Polybuyer|1 
2|Buyer2|Jutebuyer|2 
3|Buyer3|Saltbuyer|3 

SellerTable has: 
1|Seller1|Polyseller|1 
2|Seller2|Juteseller|2 
3|Seller3|Saltseller|3 

現在我想做的事情,我想在ITEMNAME和相關的姓氏和名字選擇查詢買家和賣家。假設我想要鹽和買家和賣家的名單。我會查詢:

SELECT buyer.fname, buyer.lname, itemName, seller.fname, seller.lname 
FROM buyer, seller, item 
WHERE item.itemID = 3; 

我會想到這回:

Buyer3|Saltbuyer|Salt|Seller3|Saltseller 

而是我得到:

Buyer1|polybuyer|Salt|Seller1|polyseller 
Buyer1|polybuyer|Salt|Seller2|juteseller 
Buyer1|polybuyer|Salt|Seller3|saltseller 
Buyer2|jutebuyer|Salt|Seller1|polyseller 
Buyer2|jutebuyer|Salt|Seller2|juteseller 
Buyer2|jutebuyer|Salt|Seller3|saltseller 
Buyer3|saltbuyer|Salt|Seller1|polyseller 
Buyer3|saltbuyer|Salt|Seller2|juteseller 
Buyer3|saltbuyer|Salt|Seller3|saltseller 

所以我在哪裏搞亂?這是一個糟糕的數據庫設計還是壞的查詢或兩者兼而有之?非常感謝你提前。

回答

0

您正在從一個選擇中的買方和賣方表中獲取結果,但您並未使用任何聯結。在這種情況下,計算carthesian結果(每個買方與每個賣方合併),因此結果中包含所有內容。 嘗試在buyer.itemID=seller.itemID上進行內部連接,並且您的查詢應該可以正常工作。

3

您需要使用JOIN適當根據自己的主鍵 - 外鍵關係的3個表結合起來,例如:

SELECT buyer.fname, buyer.lname, itemName, seller.fname, seller.lname 
FROM item 
    INNER JOIN seller on item.itemID = seller.itemID 
    INNER JOIN buyer on item.ItemID = buyer.itemID 
WHERE item.itemID = 3; 
+1

FOREIGN KEY約束僅用於*更改數據庫時;在查詢中,您必須手動編寫聯接。 –

+0

或者使用USING加入指定的公共列,結果只剩下一個。 NATURAL JOIN爲所有常見的列做了這些。 – philipxy

0

感謝所有,ESP。 har07,那個答案完美無缺。 FYI另一件似乎也工作的東西是:

SELECT buyer.fname, buyer.lname, item.itemName, seller.fname, seller.lname 
FROM buyer, seller, item 
WHERE buyer.buyerID = item.buyerID AND seller.sellerID = item.sellerID; 

我想功能上這兩個語句都是一樣的。