Προς το περιεχόμενο

Update σε πίνακα Postgres


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 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);

Ευχαριστώ

Επεξ/σία από Asevastos
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το B.id δεν είναι SERIAL να το χρησιμοποιήσεις στη θέση του created_date;

Για ποιον λόγο όμως θέλεις να διατηρείς ίδια δεδομένα σε διαφορετικές θέσεις;  Θα πρέπει να τρέχεις το UPDATE στον Α σε κάθε κίνηση του Β, με ό,τι αυτό συνεπάγεται.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

μια μπουρδα που μου ηρθε στα γρηγορα διαβαζοντας τι περιπου θες. 
Φυσικα και δεν ξερω αν τρεχει.

 

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)

Επεξ/σία από nickname2016
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...