Πώς μπορώ να κάνω ένα σύνδεσμο στον SQL με βάση το όνομα πίνακα;

ψήφοι
0

Εντάξει, έτσι έχουμε μια δέσμη των πινάκων που ονομάζονται ως εξής:

training_data_001
training_data_002
training_data_003
training_data_004
training_data_005

Και στη συνέχεια να βρει αυτά που θα δούμε ένα πεδίο σε έναν άλλο πίνακα, ας το ονομάσουμε master.training_type.

Εν πάση περιπτώσει, Αναρωτιόμουν αν κάποιος ήξερε έναν τρόπο για να κάνει ένα παράξενο όνομα πίνακα με βάση συμμετάσχουν με αυτό το είδος των δεδομένων. Κάτι σαν αυτό:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_${master.training_type}
ON foo.id = training_data_${master.training_type}.foo_id

Ξέρω ότι μπορώ να το κάνω αυτό από την πλευρά του πελάτη, αλλά θα ήταν ωραίο να έχουμε το db κάνουμε.

Επίσης, σημειώστε: αυτό είναι SQL Server.

Ενημέρωση : Αποφάσισα να το κάνω μόνο και μόνο από την πλευρά του πελάτη. Ευχαριστώ ούτως ή άλλως ο καθένας.

Ευχαριστώ!

-fREW

Δημοσιεύθηκε 09/12/2008 στις 20:54
πηγή χρήστη
Σε άλλες γλώσσες...                            


5 απαντήσεις

ψήφοι
2

Μπορείτε να χρησιμοποιήσετε μόνο τη δυναμική SQL για να διαβάσετε master.training_type να χτίσει μια σειρά που στη συνέχεια να εκτελέσει χρησιμοποιώντας EXEC (@stringvar)

Απαντήθηκε 09/12/2008 στις 20:57
πηγή χρήστη

ψήφοι
1

Η κατανεμήθηκε άποψη είναι μία δυνατή προσέγγιση. Από τη στιγμή που επιλέγετε μόνο τη στήλη foo, είναι πραγματικά μόνο ο έλεγχος για την ύπαρξη μιας σειράς στον πίνακα της κατάρτισης μέσω του εσωτερικού JOIN; Επίσης, φαίνεται σαν να προσπαθείτε να χρησιμοποιήσετε foo ως ψευδώνυμο στο ενταχθεί σας, αλλά δεν έχει συσταθεί με αυτόν τον τρόπο στον όρο SELECT σας. Ως εκ τούτου υποθέτω εδώ σε αυτό που πραγματικά θέλετε.

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

Μια άλλη πιθανή λύση:

SELECT
     foo
FROM
     dbo.master m
WHERE
     (training_type = '001' AND EXISTS (SELECT * FROM dbo.training_data_001 WHERE foo_id = m.id)) OR
     (training_type = '002' AND EXISTS (SELECT * FROM dbo.training_data_002 WHERE foo_id = m.id)) OR
     (training_type = '003' AND EXISTS (SELECT * FROM dbo.training_data_003 WHERE foo_id = m.id)) OR
     (training_type = '004' AND EXISTS (SELECT * FROM dbo.training_data_004 WHERE foo_id = m.id)) OR
     (training_type = '005' AND EXISTS (SELECT * FROM dbo.training_data_005 WHERE foo_id = m.id))

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

SELECT
     m.id,
     COALESCE(t1.my_col, t2.my_col, t3.my_col, t4.my_col, t5.my_col) AS my_col
FROM
     dbo.master m
LEFT OUTER JOIN dbo.training_data_001 t1 ON m.training_type = '001' AND t1.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_002 t1 ON m.training_type = '002' AND t2.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_003 t1 ON m.training_type = '003' AND t3.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_004 t1 ON m.training_type = '004' AND t4.foo_id = m.id
LEFT OUTER JOIN dbo.training_data_005 t1 ON m.training_type = '005' AND t5.foo_id = m.id
Απαντήθηκε 09/12/2008 στις 21:43
πηγή χρήστη

ψήφοι
1

να κάνουμε κάτι σαν αυτό:

create view training_data_all as
select '001' as training_type, * from training_data_001
union all
select '002' as training_type, * from training_data_002
union all
select '003' as training_type, * from training_data_003
union all
select '004' as training_type, * from training_data_004
union all
select '005' as training_type, * from training_data_005

Στη συνέχεια απλά επιλέξτε και να συμμετέχετε σε / από αυτό:

SELECT foo FROM master WHERE id = ? 
INNER JOIN training_data_all
ON foo.id = training_data_all.foo_id
WHERE training_data_all.training_type = ${master.training_type}

Εάν η λίστα τραπέζι είναι να αυξηθεί / συρρικνωθεί την πάροδο του χρόνου, μπορείτε να γράψετε την ίδια άποψη δυναμικά με βάση τους πίνακες που υπάρχουν κάνοντας κάποιες αναζητήσεις στους πίνακες του συστήματος.

Τίποτα από αυτά δεν είναι πολύ αποτελεσματικό όμως. Μπορεί απλά ETL αυτά τα δεδομένα σε συνδυασμό τραπέζι σε κάποιο σταθερό χρονικό διάστημα;

Απαντήθηκε 09/12/2008 στις 21:22
πηγή χρήστη

ψήφοι
1

Εάν οι πίνακες είναι όλα τα ίδια δομή, τη δημιουργία ενός υποσυστημάτων Δείτε όλη τους πίνακες και να ενταχθούν κατά την προβολή. Θα πρέπει να κάνετε έναν περιορισμό ελέγχου σε μια στήλη (ίσως μια ημερομηνία), έτσι ώστε η Optimiser ερώτημα μπορεί να κάνει αποβολή διαμέρισμα.

Απαντήθηκε 09/12/2008 στις 21:03
πηγή χρήστη

ψήφοι
1

Μπορείτε να το κάνετε μόνο με τη δυναμική SQL σε αποθηκευμένα proc. Μπορείτε επίσης να δημιουργήσετε τις απόψεις ή αποθηκεύονται procs εκ των προτέρων με παραγωγή κώδικα, αν δεν θέλετε να το κάνετε on the fly για την ασφάλεια ή για άλλους λόγους.

Απαντήθηκε 09/12/2008 στις 20:57
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more