我有这三个表:
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 :(得分: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;
我认为两个声明在功能上都是相同的。