Veröffentlicht 9. Oktober 20186 j 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?
9. Oktober 20186 j 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?
9. Oktober 20186 j 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.
9. Oktober 20186 j Das kommt auf das DBMS an ... Beispielsweise bei PostgreSQL kann man über die pg-System-Tables auf die kompletten Strukturen zugreifen.
9. Oktober 20186 j 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.
9. Oktober 20186 j 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.
9. Oktober 20186 j 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 20186 j von Whiz-zarD
9. Oktober 20186 j 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.
9. Oktober 20186 j 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 20186 j von PVoss
9. Oktober 20186 j 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.
9. Oktober 20186 j 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.
9. Oktober 20186 j Autor 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?
9. Oktober 20186 j 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 20186 j von r4phi
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.