2012-05-31 5 views
0

Ma requête SQL crache 3000 requêtes alors qu'elle devrait cracher 20, j'utilise Oracle.Requêtes de liaison de requêtes Oracle

Voici les tableaux:

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) 

et ma requête

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; 

Répondre

2

On dirait que vous avez oublié les critères de jointure entre dbf12.item, dbf12.auction et dbf12.bid. Cela en fait essentiellement un produit croisé des trois tables, en joignant chaque rangée dans chaque rangée à chaque rangée dans tous les autres.

Essayez quelque chose comme ceci:

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 

Vous pouvez aussi dire quelque chose comme:

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 
+0

Où puis-je ajouter la clause WHERE? – user1393064

+0

La clause where irait à la toute fin de votre requête après la clause from –

+0

là où statement throws 3000+ rows, la jointure interne throws 0 rows. il devrait être 20 lignes – user1393064

Questions connexes