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值为空,这可能是由于左连接。有没有其他加入方式可以用来消除空的?我想一个人可能有电子邮件但没有电话号码,反之亦然?是的,但是,在我正在处理的案例中,我已经确认每个人都有一个电子邮件和一个电话号码。您可以使用内部连接,但如果电话或电子邮件丢失,则将跳过整行。