【发布时间】:2011-11-30 03:38:15
【问题描述】:
我正在尝试使用以下 sql 语句查询 2 个表,以尝试从每个包含特定 id 的表中返回所有记录。
SELECT Phone.Phone, Email.Email FROM Contacts.Phone, Contacts.Email
WHERE Phone.ContactId = :contactId AND Email.ContactId = :contactId
Contacts.Phone 表包含给定 ID 的 2 个电话号码,Contacts.Email 包含给定 ID 的 1 个电子邮件。使用上面的 sql 查询,我得到以下行返回。当然,这只是我的每个表的结果集在行数上匹配的情况的一个示例。
Row 1: 555-555-5555 - email@email.com
Row 2: 666-666-6666 - email@email.com
当我尝试获取时,重复电子邮件以便填写第二行:
Row 1: 555-555-5555 - email@email.com
Row 2: 666-666-6666 - NULL
我想我需要使用UNION 以某种方式加入表,但我无法确切地弄清楚如何编写 sql 语句。另一种选择是执行 2 个单独的 SQL 查询,这会更容易,但我认为在性能方面最好在一个查询中收集我需要的所有数据。
我正在使用 MySQL。
【问题讨论】:
-
我认为您需要
LEFT JOIN电子邮件表。 -
@ryandlf 一个联系人 ID 有 2 个(或更多)电话号码,一个联系人 ID 可以有 2 个(或更多)电子邮件?
-
我认为您想使用两个子查询,每个子查询都有一些 ROWNUM/rank/row_number 的变体,并在该字段上执行完全外连接。对于特定查询,您必须告诉我们您使用的是什么 RDBMS(MySQL?Oracle?SQL Server?PostgreSQL?其他?)。也就是说,我认为您的说法是“在性能方面,最好在一个查询中收集我需要的所有数据”是错误的。一个提取 n 行的查询优于 n 个每个提取一行的查询,但没有理由将两个逻辑上分离的查询合并为一个。
-
是的,我正在建立一个联系人数据库,我的想法是动态电话号码、电子邮件等,因此对于我添加到数据库中的每个联系人,我可以拥有任意数量的电话号码(家庭、工作、手机等)以及电子邮件、地址等。这就是为什么我将它们分成自己的表并使用外部 id 将它们与初始联系人表连接起来。