Abfrage mit Unterabfragen und Erstellung einer CSV

Hallo Liebes Forum,

nach einigem Suchen und Versuchen die Teile zusammen zuführen wollte ich fragen, ob es eine Lösung hierfür gibt.

Verwendung Postgresql 13.3

In einer Datenbank wird eine verknüpfungstabelle verwendet, um Werte zweier Tabellen zu verbinden.
(Logik des Frontends)

tabelle_1 > ID
tabelle_2 > Vernk_ID

Verknüfungstabelle hat folgende Werte
KEYID ERSTDATUM ERSTUSER ID VERKN ID SORT

Die erste Abfrage liefert zwei Spalten
ID
VERKN_ID

################################
copy
(select
tbl_1 AS ID,
tbl_2 AS VERNK_ID

from tbl_1, tbl_2
where
TO ‘…csv’ DELIMITER ‘;’ CSV HEADER;
#################################

Abfrage letzter Wert in Verknüpfungstabelle:
##################################
Select
keyid
where
keyid <= 1
order by
KEYID DESC
LIMIT
1
#################################
Werte in Verknüpfungtabelle fangen im negativen Zahlenraum an.

also Beispielswert: Letzter Wert = -200000

Wert für KEYID müsste dann = -199999 sein

Jetzt müssten noch die restlichen Spalten ausgegeben werden:

KEYID = Letzte Nummer in der vorhandenen Verknüpfungstabelle +1
ERSTDATUM = ‘2022-12-31 00:00:00.00000’ (kann generischer Wert sein)
ERSTUSER = 1 (Standardwert)
ID = Unterabfrage (Select …
VERKN_ID= s.o.
SORT = 2 (Standardwert)


Versuche über ROW_NUMBER () OVER bekomme ich nicht in die Abfrage mit den IDs.

Bekommt man so eine Abfrage hin ohne die Daten als csv zwischenzuspeichern ?

Vielen lieben Dank

Ich verstehe Deine Frage nicht.
1 verknüpfungstabelle um 2 Tabellen zu verknüpfen ergibt für mich 3 Tabellen.

tbl_1 as id
tbl_2 as vernk_id
from tbl_1, tbl_2

würde ein Join ohne Kriterium sein.

Der nächste SQL Schnipsel sieht aus wie ein Kriterium ohne From Clause.

CSV würde ich für einen Import benutzen, aber nie als Zwischenspeicher. Das macht überhaupt keinen Sinn. Es gibt keinen Funktionsgewinn im Einsatz CSV versus echter Tabelle, ich schwör.

Es ist am Ende etwas unerheblich, ob Daten als CSV vorliegen oder als Tabelle.
Wenn Du also von den vorhandenenen Daten einfach Beispiel Selects her kopierst mit der Ausgabe von jeweils 3 Datensätzen und eine Darstellung anfügst, die das gewünschte Ergebnis zeigt, wäre das vermutlich als Anforderung recht verständlich.

Gib mal bitte an wie Deine Tabellen aussehen (jedenfalls der wesentliche Teil) und erkläre mal genau, was Du eigentlich abfragen möchtest.

Bekommt man so eine Abfrage hin ohne die Daten als csv zwischenzuspeichern ?

(Ohne Dein Problem verstanden zu haben:) Ja

Vielen Dank erst mal für die Rückmeldungen und bitte vielmals um Entschuldigung, wenn ich das irgendwie nicht richtig beschrieben habe.

Ich versuche das Problem etwas anders zu beschreiben.

Es sind drei Tabellen, die in Beziehung zueinander stehen.

tbl_1

| ID | Abgleichfeld | Verknüpfungsfeld zu tbl_2

tbl_2

| ID | Abgleichfeld |

tbl_3 = Zieltabelle

Das Ziel:

Es soll in die bestehende Tabelle tbl_3 folgende Werte geschrieben werden.

Zieltabelle

KEYID ERSTDATUM ERSTUSER ID VERKN ID SORT
-482734 2022-05-20 06:00:00.997148 1 101415 574463 2

Werte in Zieltabelle tbl_3
Zunächst soll die forlaufende KEYID geschrieben werden.
-482733

ERSTDATUM
ist eigentlich ein Zeitstempel, kann aber auch immer ein Standardwert geschrieben werden

ERSTUSER
Kann immer der Wert = 1 geschrieben werden

ID
ID aus tbl_1

VERKN_ID
ID aus tbl_2

SORT
Kann immer der Wert 2 geschrieben werden

#####################################################

.
Wert aus tab_2 soll als Verknüpfung in tbl_1 in einem Frontend dargestellt werden.
Die Tabelle tbl_3 regelt/dokumentiert die Verknüpfungen.
################################################

Diese Abfrage zeigt an, welche IDs über das Abgleichfeld als Verknüpfung in tbl_3 geschrieben werden sollen.

select
tbl_1.id AS ID,
tbl_2.id AS VERKN_ID
from
tbl_1,
tbl_2
where
tbl_1.Abgleichfeld = tbl_2.Abgleichfeld
and tbl_1.Verknüpfungsfeld is NULL

#############################################

Da hier ja nur zwei Spalten ausgegeben werden, müssten die anderen Werte, die in tbl_3 geschrieben werden müssen auch generiert werden.

KEYID ERSTDATUM ERSTUSER ID VERKN ID SORT
101415 574463

KEYID
Der Wert KEYID könnte theoretisch aus der tbl_3
über den letzten Eintrag +1 erzeugt werden und müsste dann für die Anzahl der gefunden Daten
aus der Abrage zu den Abgleichfeldern jeweils um 1 erhöht eingesetzt werden.
############################
Select
keyid
from
tbl_3
where
keyid <= 1
order by
KEYID DESC
LIMIT
1
##############################

Die Frage wäre ob man alle Werte (siehe Werte in Zieltabelle tbl_3)

über eine Abfrage generieren kann.
Es wäre kein Problem die Abfrage in eine Csv-Datei zu schreiben und diese dann in tbl_3 zu importieren.

Bisher habe ich keinen Weg gefunden die unterschiedlichen Abfragen so zu kombinieren, dass eine Tabelle (passend zu tbl_3) ausgegeben wird.


Ich hoffe ich konnte das Problem etwas deutlicher darstellen und ich bedanke mich ganz herzlich für Eure Hilfe und Mühen, Euch damit zu beschäftigen.

Schauen wir mal, ob ich es jetzt verstanden habe, Du willst also sowas
SELECT t1.id AS id, now() AS erstdatum, 1 AS erstuser, t2.id AS verkn_id, 2 AS sort, (Select max(keyid)+1 from tab_3) as keyid From tab_1 t1 JOIN tab_2 t2 ON (t1.verkn = t2.id)
?

(Irgendwie bin ich gerade unfähig den Quellcode übersichtlich zu schreiben - er klatscht das alles zusammen. Kann mal jemand diesbezüglich mit dem Zaunsfeld wackeln?)

Vielen Dank, ich habe auch schon eine Möglichkeit gesucht, die Abfrage übersichtlich darzustellen.

Der Ansatz ist super. Vielen Dank schon mal dafür, ich muss da noch ein wenig umstellen; aber das Prinzip ist mir jetzt klar.

Besten Dank !

:smile:
Ich habe ja nur aufgeschrieben, was ich glaube, verstanden zu haben.
Statt des max(*) - Gedöns solltest Du ev. einfach eine Sequence nehmen.

Ja, vielen Dank noch mal, ich mach dann aus der Abfrage eine csv und importiere diese dann in besagte tbl_3 (verknüfungstabelle = verk_7db68380db34b )

Es gibt nur noch ein Problem: Die KEYID sollte hochzählen.
-482707
-482706
-482705
-482704
-482703
-482702
-482701

Ich habe nicht max() genommen, sondern
##############
(
Select
(keyid) + 1
from
verk_7db68380db34b
where
keyid <= 1
order by
KEYID DESC
LIMIT
1
) as KEYID,
######################

Ergebnis derzeit, perfekt (bis auf die KEYID):
(Die Tabelle wird im Normalfall über ein Frontend gefüllt und zählt im positiven Zahlenraum +1); deswegen kann man diesen Zahlenraum über ein auto increment nicht nutzen.

keyid | erstdatum | erstuser | id | verkn_id | sort

-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 103889 | 575712 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 103891 | 575713 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 103904 | 575722 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 103901 | 575721 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 103903 | 575722 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 100715 | 291040 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 46785 | 408978 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 46787 | 408976 | 2
-482707 | 2022-12-09 18:11:01.187604+00 | 1 | 46791 | 408973 | 2

################

Aber das Hauptproblem ist gelöst, vielen Dank nochmal ! Das hat wirklich geholfen.

Sequencen (PostgreSQL: Documentation: 15: CREATE SEQUENCE) sind dein Freund.

Ja, vielen Dank; ist eine sehr gute Möglichkeit.