Zum Inhalt springen

Rückgabewert aus Select-Abfrage Joinen


murat1895

Empfohlene Beiträge

Guten Tag zusammen,

ich habe folgendes Problem.

Ich habe in etwa folgende Tabelle (Z):

ID a b tablename
1 abc aaa A
2 def bbb B

Ich möchte nun in einer Select-Abfrage alle Spalten der Tabelle Z ausgeben. Zusätzlich soll auch die Tabelle, die in der Spalte tablename steht über das Attribut b gejoint werden.

Select ID, a, b, tablename, * from Z inner join tablename Y on Z.b = Y.b

Da ich bei der Abfrage nicht weiß, welche Werte innerhalb der Spalte tablename stehen, kann ich die Tabellennamen nicht "manuell" joinen.

Habt ihr eine Idee, ob soetwas möglich ist?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb murat1895:

Guten Tag zusammen,

ich habe folgendes Problem.

Ich habe in etwa folgende Tabelle (Z):

ID a b tablename
1 abc aaa A
2 def bbb B

Ich möchte nun in einer Select-Abfrage alle Spalten der Tabelle Z ausgeben. Zusätzlich soll auch die Tabelle, die in der Spalte tablename steht über das Attribut b gejoint werden.


Select ID, a, b, tablename, * from Z inner join tablename Y on Z.b = Y.b

Da ich bei der Abfrage nicht weiß, welche Werte innerhalb der Spalte tablename stehen, kann ich die Tabellennamen nicht "manuell" joinen.

Habt ihr eine Idee, ob soetwas möglich ist?

 

Sowas lässt sich in SQL schon abbilden, ist aber ein wenig tricky und hässlich.
Im Prinzip musst du eine SQL Function implementieren die dir den SQL String zusammenbaut. Dabei musst du in dem String den TABLENAME durch den entsprechenden Wert in der Spalte ersetzen.

Anschließend kannst du diesen SQL String mit sp_executesql   (https://docs.microsoft.com/de-de/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017) aufrufen. So habe ich das bereits öfters in MSSQL realisiert.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 5 Minuten schrieb Whiz-zarD:

Mit relationalen Datenbanken nicht möglich.

Was soll denn da auch als Ergebnis herauskommen? Das Ergebnis wäre pro Zeile auch immer ein anderes, da Tabelle A andere Spalten besitzt als Tabelle B.

Das lässt sich allerdings bspw. bei MSSQL auch ermitteln. Also die Spalten der jeweiligen Tabelle.
Mittels diese Informationen dann wieder selbst ein SQL String zusammenbauen und ausführen.
Gehen tut das... die Frage ist nur wie "hübsch" das ganze am Ende ist.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 25 Minuten schrieb r4phi:

Das lässt sich allerdings bspw. bei MSSQL auch ermitteln. Also die Spalten der jeweiligen Tabelle.
Mittels diese Informationen dann wieder selbst ein SQL String zusammenbauen und ausführen.
Gehen tut das... die Frage ist nur wie "hübsch" das ganze am Ende ist.

Nein, das geht nicht. Das geht nur höchstens, wenn im Ergebnis alle Zeilen von allen Tabellen enthalten wären. Angenommen wir hätten folgende Tabellen:

Tabelle Z
ID a b Tabellenname
1 abc aaa A
2 def bbb B
Tabelle A
ID WertA
1 Foo
Tabelle B
ID WertB
2 Bar

Eine Relationale Datenbank kann nur eine zweidimensionale Tabelle zurückliefern. Jede Zeile hat den gleichen Ergebnissatz. Wir können nicht sagen, dass Zeile 1 die Spalten von Tabelle A besitzt und Zeile 2 die Spalten von Tabelle B. Datenbanken, die pro Zeile unterschiedliche Ergebnisse zurückliefern können sind dokumentenorientierte Datenbanken. 

Damit dies überhaupt auch mit relationalen Datenbanken funktioniert, müsste man Tabelle Z mit allen anderen Tabellen mit einem Left Join verknüpfen:

SELECT
    *
FROM
    Z
    LEFT JOIN A
        ON Z.ID = A.ID
    LEFT JOIN B
        ON Z.ID = B.ID

Dann würden wir folgendes Ergebnis bekommen:

Ergebnis
ID a b Tabellenname WertA WertB
1 abc aaa A Foo (null)
2 def bbb B (null) Bar

Das Ergebnis geht dann weiter in die Breite, je mehr Tabellen gejoint werden müssen und je mehr Spalten die Tabellen besitzen.

Bearbeitet von Whiz-zarD
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Minuten schrieb Whiz-zarD:

Das Ergebnis geht dann weiter in die Breite, je mehr Tabellen gejoint werden müssen und je mehr Spalten die Tabellen besitzen.

Das ist mir klar. Eventuell habe ich mich auch falsch ausgedrückt.
Was ich mir vorgestellt habe und sich umsetzen liese wäre beispielsweise folgendes:

  • Ermittel den Tabellennamen tbl aus Tabelle Z
  • Ermittel die Spaltennamen aus Tabelle Z
  • Erstelle anhand der beiden vorherigen Informationen eine Abfrage die die Tabelle tbl mit den Spalten abfragt bzw. entsprechend einen Join erstellt.

Nichts desto trotz kann er ja die Tabelle in tablename Joinen wenn er sich das manuell zusammenbaut bzw. zusammenbauen lässt.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Damit ist man dann auf der Programmiererseite um das Problem zu lösen, ob mit SP oder einer anderen Sprache der Environment ist ja egal.... und ist auch nicht schlecht, manchmal machen solche Lösungen ja tatächlich am meisten Sinn.

Mich würde aber sehr interessieren, welches Problem hier eigentlich gelöst werden soll. Für mich sieht das hier stark nach einem XY-Problem aus zudem es sicher auch üblichere Lösungsansätze gibt.

Bearbeitet von PVoss
Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 6 Minuten schrieb r4phi:
  • Erstelle anhand der beiden vorherigen Informationen eine Abfrage die die Tabelle tbl mit den Spalten abfragt bzw. entsprechend einen Join erstellt.

Wie gesagt, dies würde nur mit Left Joins klappen. Dann wird das Ergebnis aber dementsprechend breit. Wenn man nicht in die Breite gehen möchte, der muss dann pro Tabelle ein eigenes Select-Statement generieren lassen. Dies ist dann aber abhängig von der jeweiligen Datenbank, welche Sprache dort zum Einsatz kommt, denn mit reinem SQL ist dies nicht möglich.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 2 Stunden schrieb Enno:

Ja sowas ist mit Programmierung möglich nicht jedoch mit einem einfach Join wie du dir das vorstellst.

 

1. Frage haben die Tabellen die in tabellenname vorkommen können immer den gleichen Aufbau?

Nein die Tabellen haben nicht denselben Aufbau. Ich benötige auch nur die Anzahl der Zeilen, wo eine bestimmte Bedinung zutrifft.

Ich habe nun versucht, die Daten nicht mehr über einen Join zu bekommen. Als alternative habe ich eine Skalarwertfunktion geschrieben, die mir den benötigten Wert ermittelt und zurückgeben soll:

USE XXX
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[getCountIncomingBoxByFunction](
@tablename varchar(50)
,@username varchar(50)
,@step varchar(10)
,@filter_field_name1 varchar(50)
,@filter_field_name2 varchar(50) 
,@filter_field_value1 varchar(50) 
,@filter_field_value2 varchar(50)
,@filter_operator1 varchar(5)
,@filter_operator2 varchar(5)
,@filter_operation varchar(5)
,@sql_string varchar(1000)) RETURNS VARCHAR(1000)

AS 
BEGIN
DECLARE @sql varchar(1000);
DECLARE @filter varchar(1000);

-- An dieser Stelle wird noch @filter zusammengebaut

SET @sql = 'SELECT COUNT(*) as Anzahl
  FROM '+@tablename+'
  inner join INCIDENTS on INCIDENTS.processid = '+@tablename+'.processid and INCIDENTS.process_step_id = '+@tablename+'.step_id
  inner join USERJOB on INCIDENTS.jobfunction = [USERJOB].jobfunction
  where [USERJOB].username = '''+@username+''' and outdate is null and INCIDENTS.username is null and INCIDENTS.status !=6
	and '+@tablename+'.step ='+@step+'  '+@filter;

--EXEC (@sql)
RETURN @sql
END

Das Problem ist nun das das RETURN den string zurückgibt und nicht den Wert Anzahl. Habt ihr eine Idee?

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 9 Minuten schrieb murat1895:

Das Problem ist nun das das RETURN den string zurückgibt und nicht den Wert Anzahl. Habt ihr eine Idee?

Deine Vorletzte Zeile ist das Problem:
Dort gibst du @SQL zurück - also den davor zusammengebauten SQL - String und nicht das Ergebnis der Abfrage.

Um welche Datenbank geht es überhaupt? Müsste MSSQL sein ?

Wie schon oben gesagt, schau dir sp_executesql   (https://docs.microsoft.com/de-de/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql?view=sql-server-2017)  an. Dort hast die die Möglichkeit ein Rückgabeparameter zu definieren / anzugeben.

Bearbeitet von r4phi
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...