Sql 连接两个表并在同一语句中连接相同的列名

Sql 连接两个表并在同一语句中连接相同的列名,sql,sql-server,Sql,Sql Server,我有一个很大的原始数据表。它很长,我正试着把它转过来。我加入了其中的两个select语句。因此,我得到了多个同名的列。这是一个完整的外部联接,我希望两个单独的列的名称与一个列的名称相同。因为它是一个外部联接,所以我不想只为它选择一个tables列,比如selectt1.c1 谢谢 SELECT * FROM (SELECT * FROM [LabData].[dbo].[FermHourlyDCSData] where Attribute='Urea') P full outer JOI

我有一个很大的原始数据表。它很长,我正试着把它转过来。我加入了其中的两个select语句。因此,我得到了多个同名的列。这是一个完整的外部联接,我希望两个单独的列的名称与一个列的名称相同。因为它是一个外部联接,所以我不想只为它选择一个tables列,比如selectt1.c1

谢谢

SELECT *
  FROM (SELECT * FROM [LabData].[dbo].[FermHourlyDCSData] where Attribute='Urea') P
  full outer JOIN 
(SELECT * FROM [LabData].[dbo].[FermHourlyDCSData] where Attribute='Water to Mash Total Water') FPD ON 
P.[TimeStamp] = FPD.[TimeStamp] 
and P.Site = FPD.Site
and P.Element = FPD.Element
实际:

Site Attribute Timestamp Value Site Attribute Timestamp Value
AD   Urea      1/1/2019  127   Null Null      Null      Null
Null Null      Null      Null  AD   Water     1/1/2019  7.5
预期/期望:

Site Attribute Timestamp Value Value
AD   Urea      1/1/2019  127  Null
AD   Water     1/1/2019  Null 7.5

ISNULL是您应该用于此操作的

ISNULL(p.Site,fpd.Site) as [Site]

ISNULL是您应该用于此操作的

ISNULL(p.Site,fpd.Site) as [Site]

试试这个,它不是很漂亮,但确实有用:

SELECT 
[Site] = ISNULL(P.[Site], FPD.[Site]),  
[Attribute] = ISNULL(P.[Attribute], FPD.[Attribute]),   
[Timestamp] =   ISNULL(P.[Timestamp], FPD.[Timestamp]), 
[Value] =   ISNULL(P.[Value], FPD.[Value]), 
[Element] =ISNULL(P.[Element], FPD.[Element])
FROM (SELECT * FROM [dbo].[FermHourlyDCSData] where Attribute='Urea') P
full outer JOIN 
(SELECT * FROM [dbo].[FermHourlyDCSData] where Attribute='Water to Mash Total Water') FPD ON 
P.[TimeStamp] = FPD.[TimeStamp] 
and P.Site = FPD.Site
and P.Element = FPD.Element

试试这个,它不是很漂亮,但确实有用:

SELECT 
[Site] = ISNULL(P.[Site], FPD.[Site]),  
[Attribute] = ISNULL(P.[Attribute], FPD.[Attribute]),   
[Timestamp] =   ISNULL(P.[Timestamp], FPD.[Timestamp]), 
[Value] =   ISNULL(P.[Value], FPD.[Value]), 
[Element] =ISNULL(P.[Element], FPD.[Element])
FROM (SELECT * FROM [dbo].[FermHourlyDCSData] where Attribute='Urea') P
full outer JOIN 
(SELECT * FROM [dbo].[FermHourlyDCSData] where Attribute='Water to Mash Total Water') FPD ON 
P.[TimeStamp] = FPD.[TimeStamp] 
and P.Site = FPD.Site
and P.Element = FPD.Element

也许我遗漏了什么,但您似乎想要一个更简单的查询:

select Site, Attribute, Timestamp,
       (case when Attribute = 'Urea' then Value end) as value_u,
       (case when Attribute = 'Water to Mash Total Water' then Value end) as value_2
from [LabData].[dbo].[FermHourlyDCSData]
where Attribute  in ('Urea', 'Water to Mash Total Water')

也许我遗漏了什么,但您似乎想要一个更简单的查询:

select Site, Attribute, Timestamp,
       (case when Attribute = 'Urea' then Value end) as value_u,
       (case when Attribute = 'Water to Mash Total Water' then Value end) as value_2
from [LabData].[dbo].[FermHourlyDCSData]
where Attribute  in ('Urea', 'Water to Mash Total Water')

您是否已查看并通过不使用
*
来限制
选择中的列?如果没有,您尝试获取您想要的结果集是什么?为什么它不起作用/提供您想要的结果?那么类似Select isnull(t1.c1,t2.c1)的东西?不知道这样行吗?我会试试。表之间的UNION ALL解决问题,而不是联接表吗?UNION ALL的问题是,我还想为值列中选定的每个列创建一个新列。即使我在每个select中使用不同的名称为列别名,它也不起作用。只有当每个表中的所有列都具有相同的名称时,精简联合和联合才起作用。您是否查看了/并通过不使用
*
来限制
选择中的列?如果没有,您尝试获取您想要的结果集是什么?为什么它不起作用/提供您想要的结果?那么类似Select isnull(t1.c1,t2.c1)的东西?不知道这样行吗?我会试试。表之间的UNION ALL解决问题,而不是联接表吗?UNION ALL的问题是,我还想为值列中选定的每个列创建一个新列。即使我在每个select中使用不同的名称为列别名,它也不起作用。我认为只有在每个表中所有列的名称都相同的情况下,瘦联合和联合才有效。谢谢大家,这些都是很好的回答。我可能需要做一些嵌套的isnull,因为我实际上想要做的不仅仅是两个表之间的连接,而且isnull只接受两个参数。你能想到比这更有效的方法吗?你可以用一个例子,当艾尔塞塔克斯的人,这些都是很好的反应。我可能需要做一些嵌套的isnull,因为我实际上想要做的不仅仅是两个表之间的连接,而且isnull只接受两个参数。你能想出比这更有效的方法吗?你可以用一个案例,当艾尔西不能对你上面的问题发表评论时“谢谢你们,这些都是很好的回答。我可能需要做一些嵌套的isnull,因为我实际上想要做的不仅仅是两个表之间的连接,而且isnull只接受两个参数。还有比这更有效的方法吗?“…检查coalesce:)类似于isnull,但有两个以上的项目我不能对上面的问题发表评论“谢谢,伙计们,这些都是很好的回答。”。我可能需要做一些嵌套的isnull,因为我实际上想要做的不仅仅是两个表之间的连接,而且isnull只接受两个参数。还有比这更有效的方法吗?“…检查coalesce:)类似于isnull,但有两个以上的项