Sql server T-SQL查询一行中可用和选定的组合

Sql server T-SQL查询一行中可用和选定的组合,sql-server,Sql Server,我有两张桌子。一个是库表,另一个是关系表(见下文)。表1列出了所有可能的邮件列表(或任何内容),表2表明联系人“John”列在邮件列表1,3,4中。 是否可以编写查询以在一行中获取所有可用邮件列表项和选定项?你能帮忙吗 一行输出: John, A:1, B:0, C:1, D:1, E:0 Mary, A:1, B:0, C:0, D:0, E:1 表1(图书馆表) 表2(关系表) 将表2中的不同触点与表1交叉连接,然后将结果与表2左连接 如果希望邮件列表在单列中用

我有两张桌子。一个是
表,另一个是关系表(见下文)。
表1
列出了所有可能的邮件列表(或任何内容),
表2
表明联系人“John”列在邮件列表1,3,4中。 是否可以编写查询以在一行中获取所有可用邮件列表项和选定项?你能帮忙吗

一行输出:

John,    A:1,  B:0,  C:1,  D:1,  E:0
Mary,    A:1,  B:0,  C:0,  D:0,  E:1
表1(图书馆表)

表2(关系表)


将表2中的不同触点与表1交叉连接,然后将结果与表2左连接

如果希望邮件列表在单列中用逗号分隔,请使用
for xml path()
技巧。试试这个

;WITH cte
     AS (SELECT b.contact,
                a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN ':1' ELSE ':0' END AS aval_mailinglist
         FROM   tab1e1 a
                CROSS JOIN (SELECT DISTINCT contact
                            FROM   table2) b
                LEFT JOIN table2 c
                       ON a.Id = c.[Mail-id]
                       and b.contact=c.contact)
SELECT contact,
       stuff((SELECT ',' + aval_mailinglist
        FROM   cte b
        WHERE  a.contact = b.contact
        FOR xml path('')),1,1,'') Mailing_list
FROM   cte a 
group by contact
如果希望结果显示在不同的列中,请使用
Pivot

DECLARE @cols VARCHAR(max)='',
        @sql  NVARCHAR(max)

SELECT @cols += NAME
FROM  (SELECT DISTINCT Quotename(Isnull(NAME, '')) + ',' NAME
       FROM   table1)a

SELECT @cols = LEFT(@cols, Len(@cols) - 1)

PRINT @cols

SET @sql=';WITH cte
     AS (SELECT b.contact,
                a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN '':1'' ELSE '':0'' END AS aval_mailinglist,
                a.name
         FROM   table1 a
                CROSS JOIN (SELECT DISTINCT contact
                            FROM   table2) b
                LEFT JOIN table2 c
                       ON a.Id = c.[Mail-id]
                       and b.contact=c.contact)

SELECT *
FROM   cte a 
pivot (max(aval_mailinglist) for name in ('
         + @cols + ') ) piv'

--print @sql
EXEC Sp_executesql @sql 

请编辑您的文章并添加所需的输出。请将John与表1交叉连接,然后左连接表2,这样它似乎无法正常工作。如果我在关系表中添加更多联系人。然后查询失败了。例如:如果我添加了。联系邮件id约翰1约翰3约翰4玛丽1玛丽5@GeorgeHuang-需要第一次查询或第二次查询的输出。。约翰,A:1,B:0,C:1,D:1,E:0玛丽,A:1,B:0,C:0,D:0,E:1再次感谢您的帮助、提示或指导。:-)
;WITH cte
     AS (SELECT b.contact,
                a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN ':1' ELSE ':0' END AS aval_mailinglist
         FROM   tab1e1 a
                CROSS JOIN (SELECT DISTINCT contact
                            FROM   table2) b
                LEFT JOIN table2 c
                       ON a.Id = c.[Mail-id]
                       and b.contact=c.contact)
SELECT contact,
       stuff((SELECT ',' + aval_mailinglist
        FROM   cte b
        WHERE  a.contact = b.contact
        FOR xml path('')),1,1,'') Mailing_list
FROM   cte a 
group by contact
DECLARE @cols VARCHAR(max)='',
        @sql  NVARCHAR(max)

SELECT @cols += NAME
FROM  (SELECT DISTINCT Quotename(Isnull(NAME, '')) + ',' NAME
       FROM   table1)a

SELECT @cols = LEFT(@cols, Len(@cols) - 1)

PRINT @cols

SET @sql=';WITH cte
     AS (SELECT b.contact,
                a.NAME + CASE WHEN c.[Mail-id] IS NOT NULL THEN '':1'' ELSE '':0'' END AS aval_mailinglist,
                a.name
         FROM   table1 a
                CROSS JOIN (SELECT DISTINCT contact
                            FROM   table2) b
                LEFT JOIN table2 c
                       ON a.Id = c.[Mail-id]
                       and b.contact=c.contact)

SELECT *
FROM   cte a 
pivot (max(aval_mailinglist) for name in ('
         + @cols + ') ) piv'

--print @sql
EXEC Sp_executesql @sql