Benutzer mit den meisten Antworten
Einträge aus mehreren Tabellen dynamisch erzeugen

Frage
-
Einen ganz wundervollen Tag zusammen,
Ich habe folgende Herausforderung:
Ich habe zwei Tabellen. 'Countries' und 'Processes'. Jede Tabelle besteht aus einer 'id' und einer 'name' Spalte.
Nun habe ich noch eine dritte Tabelle 'FteCountryProcess'. Diese hat drei Spalten. 'countryId', 'processId', 'fte'. 'countryId' und 'processId' sind die Primärschlüssel. Die FKs verweisen auf die beiden anderen Tabellen, auf die jeweilige id Spalte.
Jetzt suche ich nach einem Weg wie ich in einem Query, in der dritten Tabelle, für jede Countries.id Einträge mit allen Processes und einem defaultWert für den fte erstellen kann.
Vielleicht weiss ja jemand weiter ;)
Antworten
-
Ok, ergänzend habe ich den Ursprungspost noch mal studiert und ich glaube festgestellt zu haben, dass deine "Drittabelle" ja noch leer ist.
Für eine Erstbefüllung reicht da ja ein Cross-Join (jeder mit jedem), da du ja für jedes Land alle Prozesse anbietest:
select countryid, processid, ...was immer du generierst...
into DritteTabelle
from Contries, ProcessesWie sieht es dann aber mit der weiteren Pflege aus?
Wenn der FTE-Wert aber immer genrierbar ist, warum erstellst du dann nicht einfach eine View?
create view DritteTabelle as
(select countryid, processid, ...was immer du generierst...
into DritteTabelle
from Contries, Processes)
- Als Antwort markiert Ventuz Freitag, 14. September 2018 12:00
Alle Antworten
-
Ein Query ist eine Abfrage, du benötigst aber einen Update (Execute);-).
Was immer dein "fte" ist, so musst du eine Update-Anweisung codieren:
update DritteTabelle
set fte = ....was immer du willst...
Soll fte einfach eine laufende Nummer sein, so befasse dich z.B. mit dem Thema Sequence:
https://docs.microsoft.com/de-de/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-2017Mittels
= next value from ftesequencehast du alle Felder initialisiert.
Du kannst per "alter tabel" dieses "next value..." auch als "default" festlegen.
Beim Insert into DritteTabelle musst du allerdings dann fte auslassen oder next value wieder selber aufrufen.Für alles andere kannst du ja eigene Ideen heranziehen.
-
Cool bfuerchau,
Danke! Was muss ich eigentlich tun um mich "überprüfen" zu lassen, damit ich auch Bilder posten kann.
Das mit dem Value Sequence schau ich mir definitiv an. Wenn ich sagen wir 3 Länder habe und 5 Processe habe, soll die ErgebnissTabelle 15 Rows enthalten also (countryId, processId, fte) 1,1,2.5; 1,2,2.5; 1,3,2.5; 1,4,2.5; 1,5,2.5; 2,1,2.5; 2,2,2.5 ... usw. Verstehst du was ich meine? Schwer zu erklären ohne Bild :(
-
Dann ist das, im ersten Eindruck, ein Verkettung der Werte als Zeichenfolge.
Das Ergebnis kannst du ja erst mal per select prüfen bevor du es setzt. Andererseits kannst du dir das auch immer berechnen lassen (per View).Das Verketten von Zeichen entspricht der Addition in sql, also einfach mal
select cast(countryid as varchar(10)) + '.' + cast(processid as varchar(10))
from drittetabelle.Die 10 entspricht ggf. der maximalen Ausprägung der ID-Spalten.
-
so wie ich das verstanden habe, möchtest du für jedes land jeweils alle Prozesse sehen. Versuchs mal so.
SELECT Z.countryId, Y.processId,'default' as fte FROM (
select 0 as Tempkey, countryId
from Countries
) Z INNER JOIN (
select 0 as Tempkey, processId
from Processes)
Y ON Z.TEMPKEY = y.TEMPKEY
order by Z.countryId, Y.processId
-
Ok, ergänzend habe ich den Ursprungspost noch mal studiert und ich glaube festgestellt zu haben, dass deine "Drittabelle" ja noch leer ist.
Für eine Erstbefüllung reicht da ja ein Cross-Join (jeder mit jedem), da du ja für jedes Land alle Prozesse anbietest:
select countryid, processid, ...was immer du generierst...
into DritteTabelle
from Contries, ProcessesWie sieht es dann aber mit der weiteren Pflege aus?
Wenn der FTE-Wert aber immer genrierbar ist, warum erstellst du dann nicht einfach eine View?
create view DritteTabelle as
(select countryid, processid, ...was immer du generierst...
into DritteTabelle
from Contries, Processes)
- Als Antwort markiert Ventuz Freitag, 14. September 2018 12:00
-
Hallo bfuerchau,
Eine Sicht lässt keine SELECT-INTO-Klausel zu, aber ansonsten scheint Dein Vorschlag mit dem Cross Join den Anforderungen des Threaderstellers nachzukommen. Dürfte ich Dich bitten, auf den letzten Satz mit der Sicht zu verzichten, damit das als Lösung vorgeschlagen werden kann?
@Ventuz: Hast Du bfuerchaus Vorschlag mit dem Cross Join ausprobiert?
Ich habe zwei Tabellen. 'Countries' und 'Processes'. Jede Tabelle besteht aus einer 'id' und einer 'name' Spalte.
Wenn die Spalten id in den zwei Tabellen gleichnamig sind, verwende Aliasnamen, um die Zweideutigkeit zu vermeiden:
SELECT C.id AS cid, P.id AS pid, 2.5 AS fte INTO DritteTabelle FROM Countries AS C CROSS JOIN Processes AS P
Gruß,
Dimitar
Bitte haben Sie Verständnis dafür, dass im Rahmen dieses Forums, welches auf dem Community-Prinzip „IT-Pros helfen IT-Pros“ beruht, kein technischer Support geleistet werden kann oder sonst welche garantierten Maßnahmen seitens Microsoft zugesichert werden können.
- Bearbeitet Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 14. September 2018 09:35 stilistische Korrektur