SQL Abfrage: alle eMail-Adressen ausser die des jeweiligen MA

Michi

Benutzer
Beiträge
19
Hallo zusammen,
komm hier mit einer abfrage nicht zurande.

Beispiel-Tabelle:

Ergebnis:

Ich möchte also eine Abfrage, welche eine zusätzliche Spalte erzeugt, in der jeweils alle eMail-Adressen stehen ausser die des jeweiligen MA selbst.
In echt sind das natürlich viele Zeilen mehr...

Weis jemand, wie ich das hinbekomme? Ist vermutlich einfach, ich komm aber nicht frauf :-(

Vielen Dank und Gruß
Michi
 
Werbung:
Code:
edb=*# select * from michi ;
 name | mail  
------+-------
 ma1  | mail1
 ma2  | mail2
 ma3  | mail3
 ma4  | mail4
(4 rows)

edb=*# select m1.name, string_agg(m2.mail, ';') from michi m1 cross join michi m2 where m1.name != m2.name group by m1.name;
 name |    string_agg     
------+-------------------
 ma1  | mail2;mail3;mail4
 ma2  | mail1;mail3;mail4
 ma3  | mail1;mail2;mail4
 ma4  | mail1;mail2;mail3
(4 rows)

edb=*#

ist aber PostgreSQL
 
So wirklich einfach ist das nicht, also zumindest nicht selbsterklärend. Aber in der Praxis hat sich folgendes etabliert:
Code:
SELECT    tabelle.[name],
        tabelle.email,
        stuff((    SELECT    '; ' + t.email
                FROM    tabelle t
                WHERE    t.[name] != tabelle.[name]
                ORDER BY number
                FOR XML PATH (''))
                ,1,0,'')
FROM    tabelle
Wobei dir vermutlich noch ein Kriterium im Subselect fehlt. Zumindest ergibt das für mich nur Sinn wenn du noch auf Firma oder sowas eingrenzt und nicht alle E-Mail-Adressen der Tabelle außer der einen nimmst. Also z.B.
Code:
SELECT    tabelle.[name],
        tabelle.email,
        stuff((    SELECT    '; ' + t.email
                FROM    tabelle t
                WHERE    t.firma = tabelle.firma
                AND        t.[name] != tabelle.[name]
                ORDER BY number
                FOR XML PATH (''))
                ,1,0,'')
FROM    tabelle
 
Code:
edb=*# select * from michi ;
name | mail
------+-------
ma1 | mail1
ma2 | mail2
ma3 | mail3
ma4 | mail4
(4 rows)

edb=*# select m1.name, string_agg(m2.mail, ';') from michi m1 cross join michi m2 where m1.name != m2.name group by m1.name;
name | string_agg
------+-------------------
ma1 | mail2;mail3;mail4
ma2 | mail1;mail3;mail4
ma3 | mail1;mail2;mail4
ma4 | mail1;mail2;mail3
(4 rows)

edb=*#
ist aber PostgreSQL
Funktioniert ganz genau so für MS SQL!
 
Code:
edb=*# select * from michi ;
 name | mail 
------+-------
 ma1  | mail1
 ma2  | mail2
 ma3  | mail3
 ma4  | mail4
(4 rows)

edb=*# select m1.name, string_agg(m2.mail, ';') from michi m1 cross join michi m2 where m1.name != m2.name group by m1.name;
 name |    string_agg    
------+-------------------
 ma1  | mail2;mail3;mail4
 ma2  | mail1;mail3;mail4
 ma3  | mail1;mail2;mail4
 ma4  | mail1;mail2;mail3
(4 rows)

edb=*#

ist aber PostgreSQL
vielen Dank für deinen Vorschlag. Die string_agg Funktion gibt es so leider nciht im SQL Server. Aber trotzdem herzlichen Dank!
 
So wirklich einfach ist das nicht, also zumindest nicht selbsterklärend. Aber in der Praxis hat sich folgendes etabliert:
Code:
SELECT    tabelle.[name],
        tabelle.email,
        stuff((    SELECT    '; ' + t.email
                FROM    tabelle t
                WHERE    t.[name] != tabelle.[name]
                ORDER BY number
                FOR XML PATH (''))
                ,1,0,'')
FROM    tabelle
Wobei dir vermutlich noch ein Kriterium im Subselect fehlt. Zumindest ergibt das für mich nur Sinn wenn du noch auf Firma oder sowas eingrenzt und nicht alle E-Mail-Adressen der Tabelle außer der einen nimmst. Also z.B.
Code:
SELECT    tabelle.[name],
        tabelle.email,
        stuff((    SELECT    '; ' + t.email
                FROM    tabelle t
                WHERE    t.firma = tabelle.firma
                AND        t.[name] != tabelle.[name]
                ORDER BY number
                FOR XML PATH (''))
                ,1,0,'')
FROM    tabelle
perfekt! funktioniert wunderbar. Das zusätzliche Kriterium bötige ich aktuell (noch) nicht, ist aber super mitgedacht und wird bestimmt auch so noch kommen :)
Vielen Vielen Dank!!!
 
Werbung:
Ich nehm alles zurück, entschuldige mich und behaupte das Gegenteil.
Es liegt wohl an meiner etwas in die Jahre gekommenen SQL Server Version 2008 (peinlich)
Die string_agg Funktion klappt sehr gut in höheren Versionen!

Danke nochmal an alle!
Funktioniert Alles Wunderbar! Ergebnisse, genau wie ich es mir vorgestellt hatte :)
 
Zurück
Oben