在sql

时间:2016-06-28 21:46:50

标签: sql database

我首先为员工提供两个表,第二个用于发送电子邮件,我希望看到员工发来所有电子邮件

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:对不起,如果我有一些错误,我还在学习英语

2 个答案:

答案 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
谢谢你的答案!