30. juli 2008 - 21:51Der er
6 kommentarer og 2 løsninger
UNION af +10 tabeller vha. loop?
Jeg skal samle en del tabeller fra forskellige databaser og har fundet frem til en noget besværlig metode:
SELECT * FROM Country1.dbo.Products UNION ALL SELECT * FROM Country2.dbo.Products UNION ALL ...
Det bliver dog meget kompliceret så snart jeg indsætter kriterier og joins. Så jeg er ude efter en løsning der loop'er igennem et array jeg har defineret med Country1, Country2 osv. Andre løsninger er også velkomne...
Hvis alle data skal indsaettes i samme nye tabel, saa maaske en SQL saetning per database:
INSERT INTO samlettabel SELECT * FROM bla bla WHERE bla bla; INSERT INTO samlettabel SELECT * FROM bla bla WHERE bla bla; INSERT INTO samlettabel SELECT * FROM bla bla WHERE bla bla; INSERT INTO samlettabel SELECT * FROM bla bla WHERE bla bla; INSERT INTO samlettabel SELECT * FROM bla bla WHERE bla bla; ...
Eller, hvis du vil beholde dine data dynamiske, da at oprette et samlet view for hver tabel som ganske rigtigt vil have et udseende som dit forslag. Med ved at opbygge et samlet view over tabellen fra de 10 lande/databaser. Dog ville jeg nok tilføje et felt med angivelse af databasenavnet, så du kan se hvor data stammer fra:
CREATE VIEW AlleLande.dbo.Products AS ( SELECT 'Country1' AS CountryDB, c1.* FROM Country1.dbo.Products c1 UNION ALL SELECT 'Country2' AS CountryDB, c2.* FROM Country2.dbo.Products c2 UNION ALL SELECT 'Country3' AS CountryDB, c3.* FROM Country3.dbo.Products c3 ... )
Herefter kan du så bruge dette view som du ville en normal tabel i dine dynamiske forespørgsler.
Jeg er ikke klar over, om dette er en gangbar vej på MS SQL Server, som det ud fra den brugte databaseopbygning ser ud til at du bruger. Du har imidlertid anbragt dit spørgsmål under Generelt, så mit svar er også mere generelt end måske realistisk.
#1 Din løsning virker helt som den skal. Men kan man ikke gøre det smartere? F.eks ved at definere hvilke tabeller den skal trække data fra og så bruge et loop til at gentage den samme streng bare med forskellig tabel. Hvis ikke det er muligt, kan man så bruge variabler i sin sql streng, som bliver defineret i linien ovenover?
Uden at skulle gøre mig klog på SQL Server specialiteter burde du kunne lave en Stored Procedure, som kan opbygge og udføre en dynamisk forespørgsel baseret på parametre på kaldet. Den skal så udføre en PREPARE sql, OPEN en cursor, og returnere et dataset.
Men jeg kan godt tvivle lidt på, om det vil være mere effektivt end det tidligere foreslåede - det er bl.a. afhængig af, om indexer kan udnyttes. Som sagt er jeg dog ikke ekspert på området.
Så fik jeg arbejdet mig frem til et resultat jeg er tilfreds med foreløbigt. Resultatet blev en cursor som trækker data fra en tabel hvor jeg har defineret de +10 tabeller. For hver række i den tabel eksekveres en INSERT INTO som samler alle data i én tabel.
Jeg vil gerne sige tak til jer begge - uden jeres inputs/ideer havde det ikke været muligt at komme frem til en løsning. Jeg fordeler pointene 50/50 imellem jer, ok?
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.