Asevastos Δημοσ. 10 Ιουνίου 2022 Δημοσ. 10 Ιουνίου 2022 (επεξεργασμένο) Καλησπέρα, χρειάζομαι ένα query το οποίο προσπαθώ να φτιάξω αλλά δε τα καταφέρνω. Έχω 2 πίνακες Α, Β που μοιράζονται ένα ID και θέλω να κάνω update τη στήλη 'status' του πίνακα Α από τιμές του πίνακα Β. Ο Β έχει πολλά statuses για το ίδιο ID (το οποίο και είναι primary key στον πίνακα Α) οπότε παίρνω το τελευταίο χρονικά και αυτό είναι που θέλω να επιστρέψω. Αυτό που έχω γράψει είναι: UPDATE TableA a SET status = ( SELECT b.status FROM B b WHERE b.created_date = (select max(created_date) from B bb where bb.id = b.id) AND b.id = a.id ) Το αποτέλεσμα είναι: more than one row returned by a subquery used as an expression. Δηλαδή λογικά η "SELECT b.status" επιστρέφει πολλά αποτελέσματα. Γνωρίζει κανείς πώς μπορώ να γράψω το query ώστε να κάνει update στον πίνακα Α για κάθε ID το corresponding status από τον Β (αυτό με το max date από τα πιθανά statuses); Ευχαριστώ Επεξ/σία 10 Ιουνίου 2022 από Asevastos
tsofras Δημοσ. 10 Ιουνίου 2022 Δημοσ. 10 Ιουνίου 2022 1 ώρα πριν, Asevastos είπε Καλησπέρα, χρειάζομαι ένα query το οποίο προσπαθώ να φτιάξω αλλά δε τα καταφέρνω. Έχω 2 πίνακες Α, Β που μοιράζονται ένα ID και θέλω να κάνω update τη στήλη 'status' του πίνακα Α από τιμές του πίνακα Β. Ο Β έχει πολλά statuses για το ίδιο ID (το οποίο και είναι primary key στον πίνακα Α) οπότε παίρνω το τελευταίο χρονικά και αυτό είναι που θέλω να επιστρέψω. Αυτό που έχω γράψει είναι: UPDATE TableA a SET status = ( SELECT b.status FROM B b WHERE b.created_date = (select max(created_date) from bb bb where bb.id = b.id) AND b.id = a.id ) Το αποτέλεσμα είναι: more than one row returned by a subquery used as an expression. Δηλαδή λογικά η "SELECT b.status" επιστρέφει πολλά αποτελέσματα. Γνωρίζει κανείς πώς μπορώ να γράψω το query ώστε να κάνει update στον πίνακα Α για κάθε ID το corresponding status από τον Β (αυτό με το max date από τα πιθανά statuses); Ευχαριστώ Τρέξε σκέτο το inner select για να δεις γιατί φέρνει διπλά αποτελέσματα. Το create _date είναι DATE ή Timestamp? Μάλλον έχεις επάνω από μία εγγραφές στην ίδια ημέρα, οπότε εκεί ποιο status θέλεις? Αν δεν σε ενδιαφέρει μπορείς να βάλεις distinct στο 2ο select, αλλιώς θέλεις redesign και να αλλάξεις την κολώνα σε Timestamp
MastroGiannis Δημοσ. 10 Ιουνίου 2022 Δημοσ. 10 Ιουνίου 2022 Το B.id δεν είναι SERIAL να το χρησιμοποιήσεις στη θέση του created_date; Για ποιον λόγο όμως θέλεις να διατηρείς ίδια δεδομένα σε διαφορετικές θέσεις; Θα πρέπει να τρέχεις το UPDATE στον Α σε κάθε κίνηση του Β, με ό,τι αυτό συνεπάγεται.
nickname2016 Δημοσ. 17 Ιουνίου 2022 Δημοσ. 17 Ιουνίου 2022 (επεξεργασμένο) μια μπουρδα που μου ηρθε στα γρηγορα διαβαζοντας τι περιπου θες. Φυσικα και δεν ξερω αν τρεχει. update tablea a set a.status = ( select b.status from tableb b inner join a on a.id = b.id ORDER BY b.create_date asc limit 1 ) βασικα βρες τις εγγραφες του πινακα Β που εχουν ιδιο id με τον πινακα α ταξινομηση κατα αυξουσα ημερομηνια, κρατα μια εγγραφη (την latest) και φερε μια στηλη (status απο τον b) Επεξ/σία 17 Ιουνίου 2022 από nickname2016
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα