我首先为员工提供两个表,第二个用于发送电子邮件,我希望看到员工发来所有电子邮件
table employees:
id | name | idE
1 | name1 | 1
2 | name2 | 2
3 | name3 | 3
table email:
id | idE | email
1 | 1 | e1@email.com
2 | 1 | e2@email.com
3 | 2 | e@email2.com
4 | 3 | e@email3.com
我有这个问题:
select e.id, e.name, m.email from employees as e inner join email as m on p.idE = m.idE
这就是结果:
id | name | email
1 | name1 | e1@email.com
1 | name1 | e2@email.com
2 | name2 | e@email2.com
3 | name3 | e@email3.com
我不需要员工1两次我只需要同一行中的两封电子邮件
大家好我修改了我的查询: 选择em.name, 东西( (选择','+ e.Email从tbl_Employees作为m inner join tbl_Email as e on m.idE = e.idE for xml path('')) ,1,1,'')作为电子邮件 从tbl_employees作为em
但现在我的问题是我在每一封电子邮件中都知道了这一点:
E1 @ email.com,E2 @ email.com,E @ email2.com,E @ email3.com,
我怎样才能只获得每位员工的电子邮件?
而不是每列中都包含每一封电子邮件
例如:
name | email
name1 | e1@email.com,e2@email.com,
name2 | e@email2.com,
name3 | e@email3.com,
pd:对不起,如果我有一些错误,我还在学习英语
答案 0 :(得分:2)
虽然你所要求的是可能的,但我相信你会得到几个答案,你的问题就是小心你想要的的好例子!您要求DBMS提供一些表示级功能。通常,您最好让SQL查找所需的数据,并在应用程序中处理表示问题。
SELECT
返回一个信息表,并且一行中每列的值通常是“原子的”,因为它包含SQL可以与其他值进行比较的单个值。如果数据库中的表符合first normal form,则它们具有相同的属性。
SQL的一个优点是“一切都是一个表”:你可以将SELECT
一个堆叠在另一个上面。
select * from (select a, b from T where a > b) as Z
每个内部表生成另一个表,下一个外表可以作用。
像group_concat
这样的函数(作为示例)生成非原子列。从那里到代码只有很短的一步:
select * from ( select group_concat(a) as a_list from T ) as Z
where a_list like '%Henry%'
程序员被迫进入搜索字符串而不是直接比较。查询变得不那么精确,因此容易出错。
在您的示例中,故障安全方法是从DBMS逐个读取结果,并通过查看idE
列来连接每个用户的地址列表。它将使您的查询更简单,如果您以后决定以另一种方式呈现它们,您可以这样做,而无需深入了解数据库逻辑。
答案 1 :(得分:0)
这是我在更改后的查询
select em.name,
STUFF(
(select ',' + e.Email from tbl_Employees as m inner join
tbl_Email as e on m.idE = e.idE
where em.idE = e.idE
for xml path('')
) ,1,1,'') as emails
from tbl_employees as em
以及此查询的结果
name | emails
name1 | e1@email.com,e2@email.com
name2 | e@email2.com
name3 | e@email3.com
谢谢你的答案!