Sql server 如果我加入同一个表两次,则从表中获取属性将失败

Sql server 如果我加入同一个表两次,则从表中获取属性将失败,sql-server,Sql Server,我试图合并两个表中的数据,但由于联系人表的格式奇怪,因此遇到了问题。当我运行查询时,它不会返回任何结果,为什么我不能同时获得电话和电子邮件?如果我试着把它们分开,效果会很好 我有一个用户表: id Name email 1 Bill abc@gmail.com 和联系人表: id Name Data 1 phone 1234 1 email abc@gmail.com 我的MSSQL查询: select co.Data as phone, co2.Data as Email

我试图合并两个表中的数据,但由于联系人表的格式奇怪,因此遇到了问题。当我运行查询时,它不会返回任何结果,为什么我不能同时获得电话和电子邮件?如果我试着把它们分开,效果会很好

我有一个用户表:

id Name   email
1  Bill   abc@gmail.com
和联系人表:

id Name Data
1  phone 1234
1  email abc@gmail.com
我的MSSQL查询:

select co.Data as phone, 
co2.Data as Email 
from Users u 
left join Contacts co on c.id=u.id 
left join Contacts co2 on c2.id=u.id 
where co.Name='email' 
and co2.Name='phone'   --if i dont add this emails and ebverything show up

您需要向联接添加更多谓词。我同意桌子不是一个伟大的建筑。这是一种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'

你的问题是不可复制的。我运行了以下脚本:

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
因此,您在帖子中遗漏了一些打字错误或其他内容,导致您的查询无法工作

例如,我更正了您的别名,使其始终使用
co
co2
。在查询中,有些地方使用了
c
c2


我还修改了where子句,将
co
与“phone”关联,将
co2
与“email”关联,因为这就是它们在选择列表中的关联方式。在问题的查询中,您可以将它们向后放置。

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

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

可能值得考虑在联系人表之外创建透视表视图,以使类似的操作更简单。别名在某些地方不匹配。。。那些只是打字错误吗?@Greenspark是的,那些是打字错误。我想我把它们都修好了,但是如果你看到了,请告诉我!这很好,但我最终得到的行(对于同一个人)的email和phone值为空,这可能是由于左连接。有没有其他加入方式可以用来消除空的?我想一个人可能有电子邮件但没有电话号码,反之亦然?是的,但是,在我正在处理的案例中,我已经确认每个人都有一个电子邮件和一个电话号码。您可以使用内部连接,但如果电话或电子邮件丢失,则将跳过整行。