sql - 一对多查询sql

标签 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, 东西( (从 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/

相关文章:

c# - 使用 OLE-DB 从数据库读取附加文件

sql - 如何在记录更改时更新不同位置(表)的多个信息?

SQL 以 "round-robin"顺序返回行

mysql - SQL 查询根据最大共同结果对结果进行排序

mysql - SQL JOIN从表flights对应的表格表2中返回记录

sql - 在触发器中获取已删除行的 ODBC 通用方法

mysql - 不同的数据库使用不同的名称引用吗?

MySQL根据条件和多列组合删除重复项

c# - 基于access数据库中的代码检索数据c#

sql - SQL : Force a value to be last in the order 中的按最后排序