好吧,我有两个表,第一个是员工表,第二个是电子邮件表,我想查看员工及其所有电子邮件
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, 东西( (从 tbl_Employees 选择 ',' + e.Email as 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: 对不起,如果我有一些错误,我还在学习英语
最佳答案
虽然您的要求是可能的,而且我相信您会得到几个答案,但您的问题是一个很好的例子,说明小心您的愿望!您要求 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
列连接每个用户的地址列表。它将使您的查询更简单,如果您以后决定以另一种方式呈现它们,您可以在不深入研究数据库逻辑的情况下做到这一点。
关于sql - 一对多查询sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38086840/