如何在SQL Server 2012中为第一张表的每个ID获取电子邮件ID(一个值),然后将第二张表的电子邮件名称显示为逗号?

时间:2018-08-24 12:01:39

标签: sql sql-server

What i have tried Results wanted like this在一个表格中,对于每个ID,根据某些条件Ex可以有多个电子邮件ID。

ID  EmailID's
1    Mike.Foster@Mail.com
1    lilly.Foster@Mail.com
2    Michel.Josh@Mail.com
2    Nash.Ted@Mail.com

我必须从另一个表中的这些ID中获取电子邮件名称,诸如此类

我需要的输出

Email_Name
Foster.Mike,Foster.Lilly
Josh.Michel,Ted.Nash

这是我尝试过的。

  SELECT  User_Email = 
    STUFF((SELECT DISTINCT ', ' + User_Email
           FROM table1 b 
           WHERE b.Component_ID= a.Component_ID
           and [Role] ='Team Lead' and Functional_Group ='Product'
          FOR XML PATH('')), 1, 2, '')
FROM [WFS].table1 a
GROUP BY table1

现在我要使用其他表格的电子邮件名称

 Select EmailNamefrom Table2 where EmailIDs IN ( 'code for Email')

表1模式

ID Component_ID EmailIDs               Role        Functional_Group 
1    1          Mike.Foster@Mail.com   Team Lead    Product
2    1          lilly.Foster@Mail.com  Team Lead    Product
3    2          Michel.Josh@Mail.com   Team Lead    Product
4    2          Nash.Ted@Mail.com      Team Lead    Product

表2架构

ID  EmailIDs                EmailName
 1   Mike.Foster@Mail.com  Foster.Mike
 2   lilly.Foster@Mail.com Foster.Lilly

欢迎提出任何建议。在此先感谢

3 个答案:

答案 0 :(得分:0)

您实际上已经关闭,但是您的SQL与您的架构不匹配。您可以根据自己的喜好进行此操作:

SELECT  Email_Name = 
    STUFF((SELECT DISTINCT ', ' + EmailIDs
           FROM table1 b 
           WHERE b.Component_ID= a.Component_ID
           and [Role] ='Team Lead' and Functional_Group ='Product'
          FOR XML PATH('')), 1, 2, '')
FROM table1 a
GROUP BY a.Component_ID;

编辑:我不明白您在问什么。可能这就是您的意思吗?

SELECT STUFF((SELECT ', ' + EmailName
FROM Table2 where EmailIDs IN ( SELECT EmailIDs
           FROM table1 
           WHERE [Role] ='Team Lead' and Functional_Group ='Product')
           FOR XML PATH('')), 1, 2, '')

或者你的意思是这样

SELECT DISTINCT Component_ID, emailNames
FROM table1
CROSS APPLY (SELECT STUFF((SELECT ', '+t2.EmailName
           FROM table2 t2
           INNER JOIN TABLE1 t1 ON t1.EmailIDs = t2.EmailIDs
           WHERE t1.Component_ID = Table1.Component_ID
           FOR XML PATH('')), 1, 2, '')
 ) t(EmailNames)
WHERE [Role] ='Team Lead' and Functional_Group ='Product'

这里是SQLFiddle Demo

答案 1 :(得分:0)

忽略此答案,因为我发现GROUP_CONCAT()是MySQL特定功能 ,这意味着它在SQL Server中不起作用,但是,我'将其保留以备将来参考。

SELECT
  GROUP_CONCAT(EmailName SEPARATOR ', ') as name
FROM
  table1
INNER JOIN table2 ON table1.EmailIDs=table2.EmailIDs
WHERE
  table1.EmailIDs=table2.EmailIDs
GROUP BY
  table1.Component_ID

输出:

Foster.Mike,Foster.Lilly

Ted.Nash,Josh.Michel

工作SQL fiddle

文档:https://dev.mysql.com/doc/refman/8.0/en/group-by-functions.html#function_group-concat

答案 2 :(得分:0)

您需要CTESTUFF()

WITH t AS (
     SELECT t1.*, t2.emailname
     FROM table1 t1 INNER JOIN
          table2 t2
          ON t2.emailids = t1.emailids 
)

SELECT id, STUFF ( (SELECT DISTINCT ','+t1.emailname
                    FROM t t1
                    WHERE t1.id = t.id
                    FOR XML PATH ('')
                   ), 1, 1, ''
                 ) AS Email_Name
FROM t
GROUP BY id;