我的SQL查询正在吐出3000个查询,当它应该吐出20时,我正在使用Oracle。
以下是表格:
Item (itemNumber, itemName, itemDescription, itemValue, itemLocation,
categoryID, sellerUsername)
Auction (auctionNumber, currency, startDateTime, endDateTime, shippingTerms,
startBidAmount, reserveAmount, bidIncrementAmount, noOfItems, itemSold,
itemNumber feedbackDateAndTime, rating, comments, paymentDate, paymentid)
Bid (bidderUsername, auctionNumber, bidDateTime,bidAmount)
和我的查询
SELECT
i.itemname,
i.itemdescription,
i.itemvalue,
CASE
WHEN i.itemnumber=a.itemnumber and a.itemSold='y' THEN 'Sold'
WHEN a.auctionnumber != b.auctionnumber and TO_CHAR(sysdate,'DD-MON-YY')>endDateTime THEN 'No Bids on that closed auction'
WHEN TO_CHAR(sysdate,'DD-MON-YY')<a.endDatetime and a.auctionnumber=b.auctionnumber
and reserveamount>(
SELECT b.bidAmount
FROM dbf12.bid b, dbf12.auction a
WHERE a.auctionnumber=b.auctionnumber
GROUP BY b.bidAmount
HAVING b.bidAmount= max(b.bidAmount)) THEN 'No Bids that meets the reserve'
ELSE 'Auction Still Open'
END
FROM
dbf12.item i, dbf12.auction a, dbf12.bid b;
答案 0 :(得分:2)
您似乎忘记了dbf12.item,dbf12.auction和dbf12.bid之间的连接条件。这使得它基本上是三个表的交叉乘积,将每个表中的每一行连接到所有其他行中的每一行。
尝试这样的事情:
SELECT
i.itemname,
i.itemdescription,
i.itemvalue,
CASE
WHEN i.itemnumber=a.itemnumber and a.itemSold='y' THEN 'Sold'
WHEN a.auctionnumber != b.auctionnumber and TO_CHAR(sysdate,'DD-MON-YY')>endDateTime THEN 'No Bids on that closed auction'
WHEN TO_CHAR(sysdate,'DD-MON-YY')<a.endDatetime and a.auctionnumber=b.auctionnumber
and reserveamount>(
SELECT b.bidAmount
FROM dbf12.bid b, dbf12.auction a
WHERE a.auctionnumber=b.auctionnumber
GROUP BY b.bidAmount
HAVING b.bidAmount= max(b.bidAmount)) THEN 'No Bids that meets the reserve'
ELSE 'Auction Still Open'
END
FROM
dbf12.item i, dbf12.auction a, dbf12.bid b
WHERE i.itemnumber = a.itemnumber and b.actionnumber = a.auctionnumber
你也可以这样说:
SELECT
i.itemname,
i.itemdescription,
i.itemvalue,
CASE
WHEN i.itemnumber=a.itemnumber and a.itemSold='y' THEN 'Sold'
WHEN a.auctionnumber != b.auctionnumber and TO_CHAR(sysdate,'DD-MON-YY')>endDateTime THEN 'No Bids on that closed auction'
WHEN TO_CHAR(sysdate,'DD-MON-YY')<a.endDatetime and a.auctionnumber=b.auctionnumber
and reserveamount>(
SELECT b.bidAmount
FROM dbf12.bid b, dbf12.auction a
WHERE a.auctionnumber=b.auctionnumber
GROUP BY b.bidAmount
HAVING b.bidAmount= max(b.bidAmount)) THEN 'No Bids that meets the reserve'
ELSE 'Auction Still Open'
END
from db12.item i
inner join dbf12.auction a on a.itemnumber = i.itemnumber
inner join dbf12.bid b on b.auctionnumber = a.auctionnumber