Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

mehrere SQL Ergebnisse in einer Spalte ausgeben

Frage Entwicklung Datenbanken

Mitglied: Saschbert

Saschbert (Level 1) - Jetzt verbinden

05.06.2008, aktualisiert 21:37 Uhr, 14707 Aufrufe, 8 Kommentare

Hallo Community,

benötige mal kurz Eure Hilfe. Ich bin gerade dabei, eine kleine Auswertung zu erstellen, und habe dabei einen Problemfall. Und mir fällt ums verrecken keine Möglichkeit ein. Wahrscheinlich ginge es mit einem Cursor oder so, aber mit Cursorn habe ich mich noch nicht beschäftigt.

System:
MS SQL 2005 Server

Hintergrund:
Ich habe eine recht komplexe, aber strukturierte Datenbank, in der Tabellen i.d.R. über eindeutige Kriterien zugeordnet sind, entweder in 1:1 oder 1:n Beziehungen.

Problem:
Ich habe zwei Tabellen, mit einem 1:n Verhältnis. Nun muss ich in einer Abfrage quasi eine Ausgabe erhalten, in der mir in Spalte 1 der eindeutige Index, der beide Tabellen verbindet, angezeigt wird, und in Spalte 2 möchte ich quasi ein Teilergebnis aus der zweite Tabelle erhalten, jedoch Kommagetrennt. Dies können maximal 4 sein, in meinem Modell, daher tragbar.

Beispiel:

Tabelle A

Id | Name
01 | ABCD
02 | EFGH
03 | IJKL


Tabelle B

Id | IdTabA | Wert
01 | 01 | 502001
02 | 01 | 502002
03 | 02 | 502000
04 | 03 | 502000
05 | 03 | 502002
06 | 03 | 500000


Ausgabe:

Name | Werte
ABCD | 502001, 502002
EFGH | 502000
IJKL | 502000, 502002, 500000


Ich hoffe, Ihr versteht, was ich meine. Die eigentliche Abfrage ist wesentlich komplizierter, aber das bekomme ich hin. Es ist nur diese eine Stelle, die ich hier mal vereinfacht skizzierte, die mir die Sorgenfalten auf die Stirn treibt.

Vielen Dank schon vorab,
Saschbert
Mitglied: bytecounter
05.06.2008 um 12:37 Uhr
Hallo,

ich würde das ganz einfach mit einem "inner join" erledigen.

http://www.sql-tutorial.net/SQL-JOIN.asp

vg Bytecounter
Bitte warten ..
Mitglied: Logan000
05.06.2008 um 13:20 Uhr
Die Anzahl der Ergebnisdatensätze beim Join währe (in diesem Bsp.) gleich der Anzahl der DS in Tabelle B.
Ich denke Saschbert möchte nur so viele DS wie in Tabelle A bekommen.
Und ich denke er hat recht. Das wird ohne Cursor nix.

@Saschbert
So schlimm sind Cursor nicht. http://msdn.microsoft.com/de-de/library/ms190028.aspx
Bitte warten ..
Mitglied: Saschbert
05.06.2008 um 13:25 Uhr
Vielen Dank erstmal. Aber ich glaube, Du hast das Problem nicht erkannt. Durch einen einfachen Join wäre die Ausgabe folgendermaßen:

Name | Werte
ABCD | 502001
ABCD | 502002
EFGH | 502000
IJKL | 502000
IJKL | 502002
IJKL | 500000

Was ich suche, ist jedoch eine Möglichkeit, quasi direkt im Resultset die Werte aus Tabelle B Kommagetrennt in einer Spalte zu erhalten. Und dabei hilft mir auch kein InnerJoin, bin ich der Meinung.
Bitte warten ..
Mitglied: Saschbert
05.06.2008 um 13:29 Uhr
Vielen Dank Logan00!

Aber Du machst mir Angst
Diese Artikel habe ich auch schon gefunden, aber nicht viel mit anfangen können. Wie dem auch seit, ich muss wohl in den sauren Apfel beißen, und mich in die Cursorproblematik einarbeiten.
Bitte warten ..
Mitglied: Logan000
05.06.2008 um 14:20 Uhr
So schlimm ist das auch nicht.

Hier hast Du mal eine Arbeitsgrundlage:
01.
CREATE TABLE #t (name Varchar(4), Wert varchar(50)) 
02.
DECLARE @ID varchar(2) 
03.
DECLARE @NAME varchar(4) 
04.
DECLARE @WERT varchar(50) 
05.
DECLARE @RESULT varchar(100) 
06.
DECLARE Name_cursor CURSOR FOR SELECT ID, Name FROM Table_1  
07.
OPEN Name_cursor 
08.
FETCH NEXT FROM Name_cursor INTO @ID , @NAME 
09.
SET @RESULT = '' 
10.
WHILE @@FETCH_STATUS = 0 
11.
BEGIN 
12.
	DECLARE Wert_cursor CURSOR FOR SELECT Wert FROM Table_2 WHERE IDTab1 = @ID 
13.
	Open Wert_cursor 
14.
	FETCH NEXT FROM Wert_cursor INTO @Wert 
15.
	WHILE @@FETCH_STATUS = 0 
16.
	BEGIN 
17.
		SET @RESULT = @RESULT + @Wert + ', ' 
18.
		FETCH NEXT FROM Wert_cursor INTO @Wert 
19.
	END 
20.
	INSERT INTO #t (name,wert) VALUES (@NAME,@RESULT) 
21.
	SET @RESULT ='' 
22.
	CLOSE Wert_cursor 
23.
	DEALLOCATE Wert_cursor 
24.
	FETCH NEXT FROM Name_cursor INTO @ID , @NAME 
25.
END 
26.
CLOSE Name_cursor 
27.
DEALLOCATE Name_cursor 
28.
SELECT * FROM #t 
29.
DROP TABLE #t 
30.
GO
Table_1 ist deine Tabelle A und Table_2 Tabelle B aus deinen Bsp.
Die Performance wird nicht so dolle sein.
Das sind 2 geschachtelte Cursor. Daher kann die Ausführung bei sehr vielen DS etwas dauern.
Bitte warten ..
Mitglied: Saschbert
05.06.2008 um 15:17 Uhr
WOW! Vielen Dank Dir! Wusste garnicht, dass man im Cursor zwei Variablen angeben kann (... INTO @ID, @Name ...), das erklärt natürlich alles. Ich konnte das jetzt in der Eile der Zeit noch nicht testen, werde das aber nachholen und berichten. Nochmals vielen Dank!
Bitte warten ..
Mitglied: filippg
05.06.2008 um 19:35 Uhr
Wenn man Cursor nicht mag sollte das auch mit einer Benutzerdefinierten Funktion gehen.

Gruß

Filipp
Bitte warten ..
Mitglied: Saschbert
05.06.2008 um 21:37 Uhr
Ja, an sowas ähnliches hatte ich auch schon gedacht, nur denke ich, die Funktion wäre recht umfangreich, weil ich ja mit verschiedenen Abfragen prüfen muss, wieviele Datensätze enthalten sind, diese quasi einzeln extrahieren, usw ... hatte auch schon überlegt, ob ich quasi einfach mit mehreren Variablen arbeite ... aber alles noch ungewiss.

Also mein Ansatz war, innerhalb der Funktion quasi in einer simpeln abfrage per TOP einer Variable den ersten Wert zuzuweisen, in einer weiteren simplen Abfrage der nächsten Variable per TOP ebenfalls einen Wert zuzuweisen, der nicht identisch mit dem ersten sein darf ... das ganze insgesammt 4x (können max 4 Werte sein!), und schon habe ich das. Und in der RETURN Variable dann durch z.B. CASE entsprechend die Kommata einfügen, sofern Vaiable 2 ebenfalls größer NULL ist ... oder so ...

Aber der CURSOR reizt mich alleine deswegen, weil ich bisher immer vermieden habe, diesen Schritt zu gehen, aber ich denke, es wohl nicht schlecht wäre, dies mal zu machen, um einfach mit Cursorn arbeiten zu können.

Aber vielen Dank für den Hinweis!
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
VB for Applications
Mehrere Spalten Durchsuchen und Ergebnisse in neuer Tabelle Ausgeben (3)

Frage von Mr.Green zum Thema VB for Applications ...

Datenbanken
gelöst SQL - mehrere UPDATE-Anweisungen in einem String per vbs (4)

Frage von goodbytes zum Thema Datenbanken ...

Datenbanken
Spalte in einer SQL-Tabelle auslesen. Werte durch Tab getrennt! (4)

Frage von Janekr77 zum Thema Datenbanken ...

Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...

Microsoft Office
Keine Updates für Office 2016 (11)

Frage von Motte990 zum Thema Microsoft Office ...