Εισαγωγή στις τιμές ... ( SELECT ... FROM ... )

Προσπαθώ να κάνω "ΕΙΣΑΓΩΓΗ ΣΕ" έναν πίνακα χρησιμοποιώντας την είσοδο από έναν άλλο πίνακα. Αν και αυτό είναι απολύτως εφικτό για πολλές μηχανές βάσεων δεδομένων, φαίνεται ότι πάντα δυσκολεύομαι να θυμηθώ τη σωστή σύνταξη για τη μηχανή SQL της ημέρας (MySQL, Oracle, SQL Server, Informix και DB2).

Υπάρχει μια σύνταξη-γρίφος που προέρχεται από κάποιο πρότυπο SQL (για παράδειγμα, SQL-92) που θα μου επέτρεπε να εισάγω τις τιμές χωρίς να ανησυχώ για την υποκείμενη βάση δεδομένων;

Λύση

Δοκιμάστε:

INSERT INTO table1 ( column1 )
SELECT  col1
FROM    table2  

Αυτή είναι η τυπική ANSI SQL και θα πρέπει να λειτουργεί σε οποιοδήποτε DBMS.

Σίγουρα λειτουργεί για:

  • Oracle
  • MS SQL Server
  • MySQL
  • Postgres
  • SQLite v3
  • Teradata
  • DB2
  • Sybase
  • Vertica
  • HSQLDB
  • H2
  • AWS RedShift
  • SAP HANA
Σχόλια (0)

@Shadow_x99: και μπορείτε επίσης να έχετε πολλαπλές στήλες και άλλα δεδομένα:

INSERT INTO table1 ( column1, column2, someInt, someVarChar )
SELECT  table2.column1, table2.column2, 8, 'some string etc.'
FROM    table2
WHERE   table2.ID = 7;

Επεξεργασία: Θα πρέπει να αναφέρω ότι έχω χρησιμοποιήσει αυτή τη σύνταξη μόνο με Access, SQL 2000/2005/Express, MySQL και PostgreSQL, οπότε αυτά θα πρέπει να καλύπτονται. Ένας σχολιαστής επεσήμανε ότι θα λειτουργήσει και με την SQLite3.

Σχόλια (2)

Και οι δύο απαντήσεις που βλέπω λειτουργούν μια χαρά στο Informix συγκεκριμένα και είναι βασικά τυπική SQL. Δηλαδή, ο συμβολισμός:

INSERT INTO target_table[()] SELECT ... FROM ...;

δουλεύει μια χαρά με το Informix και, θα περίμενα, με όλα τα DBMS. (Κάποτε, πριν από 5 ή περισσότερα χρόνια, αυτό είναι το είδος του πράγματος που η MySQL δεν υποστήριζε πάντα- τώρα έχει αξιοπρεπή υποστήριξη για αυτό το είδος της τυποποιημένης σύνταξης SQL και, AFAIK, θα λειτουργούσε OK με αυτή τη σημειογραφία). Η λίστα στηλών είναι προαιρετική, αλλά υποδεικνύει τις στήλες-στόχους με τη σειρά, οπότε η πρώτη στήλη του αποτελέσματος της SELECT θα πάει στην πρώτη στήλη που αναγράφεται στη λίστα, κ.λπ. Ελλείψει της λίστας στηλών, η πρώτη στήλη του αποτελέσματος της SELECT πηγαίνει στην πρώτη στήλη του πίνακα-στόχου.

Αυτό που μπορεί να διαφέρει μεταξύ των συστημάτων είναι ο συμβολισμός που χρησιμοποιείται για τον προσδιορισμό των πινάκων στις διάφορες βάσεις δεδομένων - το πρότυπο δεν λέει τίποτα για τις λειτουργίες μεταξύ των βάσεων δεδομένων (πόσο μάλλον μεταξύ των ΣΔΒΔ). Με το Informix, μπορείτε να χρησιμοποιήσετε τον ακόλουθο συμβολισμό για την αναγνώριση ενός πίνακα:

[dbase[@server]:][owner.]table

Δηλαδή, μπορείτε να καθορίσετε μια βάση δεδομένων, προαιρετικά να προσδιορίσετε τον διακομιστή που φιλοξενεί αυτή τη βάση δεδομένων αν δεν βρίσκεται στον τρέχοντα διακομιστή, ακολουθούμενη από έναν προαιρετικό ιδιοκτήτη, τελεία και τέλος το πραγματικό όνομα του πίνακα. Το πρότυπο SQL χρησιμοποιεί τον όρο schema για αυτό που η Informix αποκαλεί ιδιοκτήτη. Έτσι, στο Informix, οποιοσδήποτε από τους ακόλουθους συμβολισμούς θα μπορούσε να προσδιορίσει έναν πίνακα:

table
"owner".table
dbase:table
dbase:owner.table
dbase@server:table
dbase@server:owner.table

Ο ιδιοκτήτης γενικά δεν χρειάζεται να τεθεί σε εισαγωγικά- ωστόσο, αν χρησιμοποιήσετε εισαγωγικά, πρέπει να γράψετε σωστά το όνομα του ιδιοκτήτη - γίνεται ευαίσθητο σε πεζά και κεφαλαία. Δηλαδή:

someone.table
"someone".table
SOMEONE.table

όλα προσδιορίζουν τον ίδιο πίνακα. Με την Informix, υπάρχει μια ήπια επιπλοκή με τις βάσεις δεδομένων MODE ANSI, όπου τα ονόματα των ιδιοκτητών μετατρέπονται γενικά σε κεφαλαία (η informix αποτελεί εξαίρεση). Δηλαδή, σε μια βάση δεδομένων MODE ANSI (που δεν χρησιμοποιείται συνήθως), θα μπορούσατε να γράψετε:

CREATE TABLE someone.table ( ... )

και το όνομα του ιδιοκτήτη στον κατάλογο του συστήματος θα ήταν "SOMEONE", αντί για 'someone'. Αν περικλείσετε το όνομα ιδιοκτήτη σε διπλά εισαγωγικά, λειτουργεί σαν οριοθετημένο αναγνωριστικό. Με την τυπική SQL, τα οριοθετημένα αναγνωριστικά μπορούν να χρησιμοποιηθούν σε πολλά σημεία. Με το Informix, μπορείτε να τα χρησιμοποιήσετε μόνο γύρω από τα ονόματα ιδιοκτητών -- σε άλλα πλαίσια, το Informix αντιμετωπίζει τόσο τις μονές όσο και τις διπλές εισαγωγικές συμβολοσειρές ως συμβολοσειρές, αντί να διαχωρίζει τις μονές εισαγωγικές συμβολοσειρές ως συμβολοσειρές και τις διπλές εισαγωγικές ως οριοθετημένα αναγνωριστικά. (Φυσικά, για λόγους πληρότητας, υπάρχει μια μεταβλητή περιβάλλοντος, DELIMIDENT, η οποία μπορεί να οριστεί -σε οποιαδήποτε τιμή, αλλά το Y είναι το ασφαλέστερο- για να υποδείξει ότι τα διπλά εισαγωγικά περιβάλλουν πάντα τα οριοθετημένα αναγνωριστικά και τα μονά εισαγωγικά περιβάλλουν πάντα τις συμβολοσειρές).

Σημειώστε ότι ο MS SQL Server καταφέρνει να χρησιμοποιεί [delimited identifiers] που περικλείονται σε αγκύλες. Μου φαίνεται περίεργο και σίγουρα δεν αποτελεί μέρος του προτύπου SQL.

Σχόλια (0)