Avatar billede barto Nybegynder
30. juli 2008 - 21:51 Der 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...
Avatar billede arne_v Ekspert
30. juli 2008 - 22:01 #1
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;
...
Avatar billede kjulius Novice
30. juli 2008 - 23:10 #2
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.
Avatar billede barto Nybegynder
31. juli 2008 - 16:34 #3
#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?
Avatar billede kjulius Novice
31. juli 2008 - 22:56 #4
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.
Avatar billede arne_v Ekspert
01. august 2008 - 01:13 #5
Man kan godt lave det i en SP.

F.eks. en SP uden argument som kalder en anden SP n gange med tabel navn som argument.
Avatar billede barto Nybegynder
03. august 2008 - 19:58 #6
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?
Avatar billede kjulius Novice
03. august 2008 - 23:58 #7
Helt okay...
Avatar billede arne_v Ekspert
25. oktober 2008 - 23:18 #8
OK
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester