2013-03-07 88 views
0

一直在这工作了几个小时,它使我疯狂。通常我只需要从一张表中做简单的MS SQL东西,但是现在我需要2个数据并且丢失了。SQL Table Join独特的字段命名不同

数据库名称:事件
表名: FeedUpdate和夹具

饲料更新字段:
[事件ID],[说明],[DataProviderId],[UpdateTimestamp]

Fixture Fields:
[FixtureId],[Description],[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”表具有相同的事件ID多个条目

任何指针将是巨大的

+0

提供一些示例数据,这将有助于建立一个准确的SQL根据自己的需要。 – 2013-03-07 12:47:18

+0

其他字段中的所有值在单个EventId的行之间是相同的,或者它们可能具有不同的值。 – 2013-03-07 12:50:44

回答

0

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

用作分配相同的列名:

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

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

+0

EventId和其他FixtureId具有完全相同的值。只是不同的名字。我该如何解决/ – 2013-03-07 12:48:39

+0

请参阅编辑。 :o) – Paul 2013-03-07 12:49:43

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' 
+0

这样做的工作:SELECT F. * FROM [Event]。[dbo]。[Fixture] As F Where F.DataProviderId = 6 AND F.StartTime> = CONVERT(DATETIME,'2013-03- 05 00:00:00')AND F.StartTime <= CONVERT(DATETIME,'2013-03-05 00:30:00')AND F.FixtureId in( SELECT EventId FROM [Event]。[dbo] .FeedUpdate ) Order By StartTime asc GO – 2013-03-07 13:58:43

+0

Joe,那只会返回那些已经在Fixture中的事件,那为什么要用FeedUpdate连接? – 2013-03-14 11:24:27