2013-03-07 87 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