0

これに数時間取り組んでいて、気が狂ってしまいました。通常、1 つのテーブルから単純な MS SQL を実行するだけで済みますが、現在は 2 つのテーブルからのデータが必要であり、失われています。

データベース名:イベント
テーブル名: FeedUpdate および Fixture

フィード更新フィールド:
[EventId] 、[Description] 、[DataProviderId] 、[UpdateTimestamp]

フィクスチャ フィールド:
[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'

この情報を 1 つのテーブル ビューに表示し、FixtureId/EventId でグループ化します。これらはどちらも同じで、名前が異なるだけです。また、「FeedUpdate」テーブルには同じ EventId の複数のエントリがあるため、FixtureId/EventId ごとに 1 行だけにしてください。

どんなポインタでも素晴らしいでしょう

4

2 に答える 2

0

列名は一致する必要があります。1 つは EventId で、もう 1 つは FixtureId です。

AS を使用して同じ列名を割り当てます。

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

また、日付フィールドが一致しません。

于 2013-03-07T12:46:54.200 に答える
0

同じIDの行が複数ある場合、結果として何が必要なのかが質問から明確ではないため、「最新の」情報を推測しています。また、2 つの異なる日付範囲で操作します。今のところ無視していますが、おそらく同じ範囲であるべきだと思います。

考えられる解決策: 1) 今日と同じように共用体を作成しますが、'as' を使用して、両方のステートメントからの出力が同じフィールド名を持つようにします。

次に、そのユニオンから、最大のタイムスタンプを持つ各「id」のエントリを選択します。

2) いくつかの共通テーブル式を使用することで、これを改善できる場合があります。最初の式は各更新の最新のものをリストし、2 番目は更新でまだ返されていないエントリをリストし、最後にこれら 2 つの出力を選択します。イベント ID またはタイムスタンプで並べ替えられた CTE。

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'
于 2013-03-07T13:06:10.150 に答える