次のようなテーブルTestTableがあるとします。
|-------------------|------------------|------------------|
| Id | EventDate | EventCode |
|-------------------|------------------|------------------|
| 1 | 2017-04-10 | 42 |
|-------------------|------------------|------------------|
| 2 | 2017-10-32 | 50 |
|-------------------|------------------|------------------|
| 3 | 2017-06-15 | 60 |
|-------------------|------------------|------------------|
| 4 | 2017-07-13 | 10 |
|-------------------|------------------|------------------|
EventCode 60より後の日付で発生したイベントのみを選択したい。明らかに、一時変数を作成してWHERE句を使用するだけでよい。
DECLARE @TestEventDate DATETIME;
SET @TestEventDate =
(SELECT TOP 1 EventDate
FROM TestTable
WHERE EventCode = 60);
SELECT *
FROM TestTable
WHERE EventDate > @TestEventDate
しかし、私は仕方がないのですが、ここでは複数のSELECTステートメントを実行せずにこれを行う方法があるはずだと思います。一時変数を設定せずに、同じSELECT内で間接的にフィルタリングし、where句でEventDateをEventCodeにマッピングできますか?
SSMSで直接実行できるように、上記を一時テーブルに設定します。
DECLARE @TestTable TABLE(Id INT, EventDate DATETIME, EventCode INT);
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (1, '20170410', 42);
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (2, '20171030', 50);
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (3, '20170615', 60);
INSERT INTO @TestTable(Id, EventDate, EventCode) VALUES (4, '20170713', 10);
DECLARE @TestEventDate DATETIME;
SET @TestEventDate =
(SELECT TOP 1 EventDate
FROM @TestTable
WHERE EventCode = 60);
SELECT *
FROM @TestTable
WHERE EventDate > @TestEventDate
EventCodeが一意の場合、次のことができます。
SELECT T2.*
FROM TestTable AS T
INNER JOIN TestTable AS T2 ON (T.eventdate > T2.eventdate)
WHERE T.EventCode = 60
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加