SQL表连接唯一字段命名为different

时间:2013-03-07 12:43:40

标签: sql-server join

已经在这个工作了几个小时,它让我疯了。通常我只需要从一个表中执行简单的MS SQL操作,但现在我需要来自2的数据并且丢失了。

数据库名称:事件
表名: FeedUpdate和Fixture

Feed更新字段:
[EventId],[Description],[DataProviderId],[UpdateTimestamp]

灯具字段:
[FixtureId],[描述],[DataProviderId],[StartTime]

到目前为止我一直在尝试的查询:

SELECT [FixtureId],[Description] ,[DataProviderId] ,[StartTime]
FROM [Event].[dbo].[Fixture]
WHERE [DataProviderId] = '6' AND StartTime >= '2013-03-05 00:00:00.0000000'
  AND StartTime <= '2013-03-05 00:30:00.0000000'

  UNION ALL

SELECT [EventId] ,[Description] ,[DataProviderId] ,[UpdateTimestamp]
FROM [Event].[dbo].[FeedUpdate]
WHERE [DataProviderId] = '6' AND UpdateTimestamp
  BETWEEN '2013-03-05 00:00:00.0000000' AND '2013-03-05 00:01:00.0000000'

我希望将这些信息放在一个表视图中,按FixtureId / EventId分组,因为它们都是相同的,只是带有不同的名称。我还想每个FixtureId / EventId只有一行,因为“FeedUpdate”表有同一个EventId的多个条目

任何指针都会很棒

2 个答案:

答案 0 :(得分:0)

您的列名需要匹配 - 您有两个不同的,一个是EventId,另一个是FixtureId。

使用AS指定相同的列名:

[FixtureId] AS [FieldId]
...
[EventId] AS [FieldId]

此外,您的日期字段不匹配。

答案 1 :(得分:0)

当您有多个具有相同ID的行时,从您的问题中不清楚您想要什么,所以我猜测'最新'信息。 此外,您使用两个不同的日期范围进行操作。我现在只是忽略它,但我认为它们可能应该是相同的范围。

可能的解决方案: 1) 像今天这样建立一个联合,但使用'as'来确保两个语句的输出具有相同的字段名称。

然后从该联合中选择具有最大时间戳的每个“id”的条目。

2) 您可以通过使用几个公用表表达式来改进这一点,第一个列出每个更新的最新表达,第二个列出更新中尚未返回的条目,最后列出这两个CTE的输出选择按事件ID或时间戳记。

3) 或者,您可以使用临时表和更新来解决此问题。

这样的事情:

DECLARE @events table (
    EventId int primary key,
    Description varchar(max),
    DataProviderId int,
    [timestamp] datetime
)
INSERT @events (EventId, Description, DataProviderId, [Timestamp])
  SELECT [FixtureId], [Description], [DataProviderId], [StartTime]
    FROM [Event].[dbo].[Fixture]
      WHERE [DataProviderId] = '6' AND StartTime >= '2013-03-05 00:00:00.0000000'
        AND StartTime <= '2013-03-05 00:30:00.0000000'

UPDATE @events
SET [Description]=u.[Description], 
    [DataProviderId]=u.[DataProviderId], [Timestamp]=u.[UpdateTimestamp]
  FROM @events e
    inner join [Event].[dbo].[FeedUpdate] u on e.EventId = u.EventId
      where u.[DataProviderId] = '6' AND u.UpdateTimestamp
      BETWEEN '2013-03-05 00:00:00.0000000' AND '2013-03-05 00:01:00.0000000'