murat1895 Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Enno Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
MartinSt Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 Das kommt auf das DBMS an ... Beispielsweise bei PostgreSQL kann man über die pg-System-Tables auf die kompletten Strukturen zugreifen. maestro impostor reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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. JimTheLion reagierte darauf 1 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 (bearbeitet) 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 9. Oktober 2018 von Whiz-zarD Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
JimTheLion Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 (bearbeitet) 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 9. Oktober 2018 von PVoss Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Whiz-zarD Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 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. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 Gerade eben schrieb Whiz-zarD: Wenn man nicht in die Breite gehen möchte, der muss dann pro Tabelle ein eigenes Select-Statement generieren lassen. Korrekt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
murat1895 Geschrieben 9. Oktober 2018 Autor Teilen Geschrieben 9. Oktober 2018 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? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
maestro impostor Geschrieben 9. Oktober 2018 Teilen Geschrieben 9. Oktober 2018 (bearbeitet) 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 9. Oktober 2018 von r4phi Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
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.