SQLite select语句会提取所有值,尽管它不应该

时间:2014-06-09 06:01:18

标签: sql database sqlite select database-design

我有这三个表:

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

那我在哪里弄乱?它是一个糟糕的数据库设计还是一个错误的查非常感谢你。

3 个答案:

答案 0 :(得分: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 :(得分:0)

您在一个选择中从买方和卖方表中提取结果,但您没有使用任何连接。在这种情况下,会计算出结合的结果(每个买家都与每个卖家合并),因此结果中包含所有内容。  尝试在buyer.itemID=seller.itemID上进行内部联接,您的查询应该可以正常运行。

答案 2 :(得分:0)

谢谢大家,特别是har07,这个答案很有效。另外一件似乎也有用的事情是:

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;

我认为两个声明在功能上都是相同的。