Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Σύνθετο ερώτημα με UNION σε Access

Îåêßíçóå áðü ôï ìÝëïò spiliot. Τελευταία δημοσίευση από το μέλος raPhaeL στις 17-06-2005, 17:53. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  09-06-2005, 03:37 2598

    Σύνθετο ερώτημα με UNION σε Access

    Πρώτο post εδώ, οπότε ελπίζω να μην κάνω κάποια βλακεία ;-)

    Έχω μια βάση σε access, και θέλω σε ένα combobox να εισάγω έναν αριθμό (που αντιστοιχεί σε μια παραγγελία) και δίπλα ένα θαυμαστικό αν η παραγγελία περιέχει τουλάχιστον ένα προοιόν με συγκεκριμένο κωδικό σε ένα πεδίο.

    Επειδή μάλλον δεν καταλάβατε, οι πίνακες είναι (όχι όλα τα πεδία)
    Orders: OrderID, OrderNumber
    OrderDetails: OrderID, BarCodeID, Quantity
    Barcode: BarcodeID, Code, Name, PackID

    Θέλω να μου βγάζει το OrderNumber και ένα θαυμαστικό, αν στον OrderDetails για το εκάστοτε orderID υπάρχει τουλάχιστον ένα ProductID με PackID=1
    Το χάσατε ή ακόμα εδώ;
    Εννοείται ότι οι σχέσεις έχουν οριστεί σωστά.

    Προς το παρόν ο τρόπος που έχω βρει, είναι αυτός:



    SELECT Orders.OrderCode, "" AS NoUnknown
    FROM Orders
    WHERE (((Orders.OrderCode) Not In (SELECT Orders.OrderCode
    FROM Orders INNER JOIN (BarCode INNER JOIN OrderDetails ON BarCode.BarCodeID = OrderDetails.BarCodeID) ON Orders.OrderID = OrderDetails.OrderID
    WHERE (((BarCode.PackID)=1)))))

    UNION SELECT Orders.OrderCode, "!" AS HasUnknown
    FROM Orders
    WHERE (((Orders.OrderCode) In (SELECT Orders.OrderCode
    FROM Orders INNER JOIN (BarCode INNER JOIN OrderDetails ON BarCode.BarCodeID = OrderDetails.BarCodeID) ON Orders.OrderID = OrderDetails.OrderID
    WHERE (((BarCode.PackID)=1)))))

    ORDER BY OrderCode;

     

    (Οι εξτρά παρενθέσεις έχουν μπει από την access)

    Το παραπάνω, αν και δουλεύει, με έχει προβληματίσει ως προς το πόσο αποδοτικό είναι, όχι γιατί με καίει ιδιαίτερα, η βάση δεν πρόκειται να έχει σε πλήρη ανάπτυξη περισσότερες από 500 εγγραφές στον orderdetails και το πολύ 3000 στον barcodes, αλλά με ενοχλεί ότι ουσιαστικά τρέχω 2 φορές το ίδιο πράγμα (τη μια φορά βρίσκει αυτά που δεν περιέχουν και την άλλη αυτά που περιέχουν και μετά ενώνει τα αποτελέσματα). Σαν τεχνική δηλαδή δεν μου αρέσει και έχω σπάσει το κεφάλι μου πως μπορεί να γίνει καλύτερα...

    Έχετε κάποια πρόταση;
  •  09-06-2005, 07:06 2599 σε απάντηση της 2598

    Re: Σύνθετο ερώτημα με UNION σε Access

    Εγώ θα έκανα το εξής:

    Έστω View OrderDetailsBarCode:
    SELECT OrderDetails.OrderID, OrderDetails.Quantity, Barcode.Code, Barcode.Name, Barcode.PackID FROM Barcode INNER JOIN OrderDetails ON Barcode.BarcodeID = OrderDetails.BarCodeID;

    Το εν λόγω Query που έχεις παραπάνω να γίνει:
    SELECT OrderDetailsBarCode.OrderID, "!" AS StatusCol FROM OrderDetailsBarCode WHERE (((OrderDetailsBarCode.PackID)=1))

    UΝΙΟΝ

    SELECT Orders.OrderID, "-" AS StatusCol FROM Orders WHERE (((Orders.OrderID) NOT IN (SELECT  a.OrderID FROM OrderDetailsBarCode a WHERE a.PackID=1)))

    Στο πρώτο μισό του Union χρησιμοποιώ το join view αλλά στο δεύτερο μισό χρησιμοποιώ το table των orders και το μόνο που κάνω είναι να φέρω τα OrderIDs που δεν έχει φέρει το πρώτο query. Δεν έχω join στο δεύτερο query, οπότε θα είναι πιο γρήγορο από το δικό σου το αρχικό.

    George J.



    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-06-2005, 14:32 2607 σε απάντηση της 2598

    Re: Σύνθετο ερώτημα με UNION σε Access

    Δοκίμασε και αυτό :


    SELECT Orders.OrderID, MAX(IIF(OrderDetails.OrderID IS NOT NULL AND BarCode.PackID=1,"!","-"))
    FROM (OrderDetails RIGHT JOIN Orders ON
    OrderDetails.OrderID=Orders.OrderID) LEFT JOIN BarCode ON
    OrderDetails.BarCodeID=BarCode.BarCodeID
    GROUP BY Orders.OrderID;

     
    (Sorry για το copy paste απο την ACCESS).


    Sex is like programing; One mistake, and you will have to support it for the rest of your life…
  •  13-06-2005, 18:27 2728 σε απάντηση της 2598

    Re: Σύνθετο ερώτημα με UNION σε Access

    Ευχαριστώ και τους δύο για τις απαντήσεις σας.
    Έλλειπα τις προηγούμενες μέρες και δεν πρόλαβα να τα κοιτάξω...

    raPhaeLτο MAX() γιατί ακριβώς έχει μπει; Επίσης στην access λέει στα help της jet sql να αποφεύγεται η χρήση της IIF() γιατί καθυστερεί το ερώτημα. Προτείνει (αν θυμάμαι καλά την χρήση της UNION, γι αυτό και το έκανα εγώ έτσι.
  •  17-06-2005, 17:53 2904 σε απάντηση της 2728

    Re: Σύνθετο ερώτημα με UNION σε Access

    Το ΜΑΧ είναι μεταξύ των “!” και “-“ για να έρθει πρώτο το “!” αν υπάρχουν εγγραφές που τηρούν και τις δύο συνθήκες.

    Performance με λίγα Data αλλά στον SQL Server που το δοκίμασα είχε λίγο καλύτερα αποτελέσματα από το άλλο Query (O SQL δεν έχει IIF άλλα CASE).

    Τώρα αν έχει καλύτερα αποτελέσματα στην ACCESS δεν ξέρω μπορείς να το δοκιμάσεις.


    Sex is like programing; One mistake, and you will have to support it for the rest of your life…
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems