none
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 ;)

    Dienstag, 4. September 2018 09:30

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, Processes

    Wie 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
    Dienstag, 4. September 2018 12:38

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-2017

    Mittels
    = next value from ftesequence

    hast 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.

    Dienstag, 4. September 2018 09:43
  • 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 :(

    Dienstag, 4. September 2018 09:54
  • 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.

    Dienstag, 4. September 2018 10:29
  • 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

    Dienstag, 4. September 2018 12:07
  • 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, Processes

    Wie 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
    Dienstag, 4. September 2018 12:38
  • 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.

    Freitag, 14. September 2018 08:18
    Moderator
  • Die View war ja nur als Ersatz für das Erstellen gedacht.

    Der

    select bla  into newtab
    from tab1, tab2

    oder (weiß nicht ob das klappt)

    select bla  into newtab
    from tab1
    inner join tab2 on 1=1

    sollte doch aber funktionieren;-).

    Freitag, 14. September 2018 17:38