如果我连接两次相同的表,从表中获取属性将失败

时间:2018-05-17 20:30:04

标签: sql-server

我正在尝试合并来自两个表的数据但由于奇怪的方式联系人表的格式化而遇到问题。当我运行我的查询时它没有返回结果,为什么我不能同时收到电话和电子邮件?如果我尝试将它们分开来,那就完美了。

我有一个用户表:

5

和联系人表格:

id Name   email
1  Bill   abc@gmail.com

我的MSSQL查询:

id Name Data
1  phone 1234
1  email abc@gmail.com

3 个答案:

答案 0 :(得分:1)

您需要为联接添加更多谓词。我同意该表不是一个伟大的架构。这是一种EAV风格,很难与之合作。

select c.Data as phone
    , co2.Data as Email 
from Users u 
left join Contacts c on c.id = u.id
    AND co.Name = 'email' 
left join Contacts co2 on c2.id = u.id 
    AND and co2.Name='phone'

答案 1 :(得分:1)

您的问题无法重现。我运行了这个脚本:

DECLARE @Users TABLE (
  id tinyint
  );

INSERT INTO @Users (id) VALUES (1);

DECLARE @Contacts TABLE (
  id tinyint
, [Name] varchar(31)
, [Data] varchar(31)
); 

INSERT INTO @Contacts (id, Name, Data) VALUES (1,'Phone','1234'),(1,'email','abc@gmail.com');

select co.Data as phone, 
co2.Data as Email 
from @Users u 
left join @Contacts co on co.id=u.id 
left join @Contacts co2 on co2.id=u.id 
where co.Name='phone' 
and co2.Name='email'

得到了:

phone   Email
1234    abc@gmail.com

所以你有一些错误或其他东西,你留下你的帖子导致你的查询无法工作。

例如,我更正了您的别名,以便始终使用coco2。您的查询中有些地方使用了cc2

我还更正了where子句,将co与“phone”和co2与“email”关联,因为这是它们在SELECT列表中的关联方式。您在问题中的查询中将它们向后移动。

答案 2 :(得分:0)

您可以创建一个视图来轮换您的联系人数据,这将使联系人数据的许多其他用途更加简单。

CREATE VIEW vContactsPivoted
AS
SELECT
    id, email, phone
FROM
    Contacts
    PIVOT (MAX(data) FOR [name] IN (email, phone)) pivoted

之后,您可以像任何其他传统表一样使用简单连接:

SELECT
    u.id,
    u.[Name],
    c.phone,
    c.email
FROM
    [Users] u
    JOIN vContactsPivoted c ON u.id = p.id