私は基本的な履歴を保存するDBテーブルを持っています。私はそれをスーパージェネリックにしています。MS SQLの条件付き結合
表は次のようになります。私は疑問に思って何
HistoryID Action Table PrimaryKey Field OldValue NewValue User DateTime
--------------------------------------------------------------------------------------------------------------------------------------------
240233 Added QueueItem 17177 QueueItemID 17177 XXXXXXXXXXXXXXX 2016-09-16 08:38:58.060
240237 Modified QueueItem 17177 StatusTypeID 1 2 XXXXXXXXXXXXXXX 2016-09-16 08:38:59.163
240240 Modified QueueItem 17177 StatusTypeID 2 3 XXXXXXXXXXXXXXX 2016-09-16 08:39:00.850
240241 Modified QueueItem 17177 PackageID 0 XXXXXXXXXXXXXXX 2016-09-16 08:39:00.850
240249 Modified QueueItem 17177 StatusTypeID 3 4 XXXXXXXXXXXXXXX 2016-09-16 08:39:09.207
240256 Modified QueueItem 17177 StatusTypeID 4 5 XXXXXXXXXXXXXXX 2016-09-16 08:39:10.163
240257 Modified QueueItem 17177 OutputDateTime 9/16/2016 8:39:10 XXXXXXXXXXXXXXX 2016-09-16 08:39:10.163
することは可能であるが、条件付きでField
の値に応じて参加することです。私はちょっと立ち往生していますが、t-SQLを使わなければならないと思います。
フィールド上のどこかで個々の選択を行い、すべての結果を結合できますが、より良い方法があるかどうかはわかりませんでしたか?
擬似コードのようなものになるだろう
:select h.*, s.[name] from history h
some kind of condition that when satified joins the statusType table and if not, then perhaps sets s.[name] to null
私はこのような何かを試してみました、そしてそれはStatusTo 'で「StatusFrom」の作品ではなく - それは最後の行に日付を変換することはできませんので、失敗しましたintに。
select h.*,
so.[Name] as StatusFrom,
sn.[Name] as StatusTo
from history h
left outer join StatusType so
on so.StatusTypeID = Convert(int, h.OldValue)
AND 1 = case WHEN h.field = 'StatusTypeID'
THEN 1
else 0
end
left outer join StatusType sn
on sn.StatusTypeID = Convert(int, h.NewValue)
AND 1 = case WHEN h.field = 'StatusTypeID'
THEN 1
else 0
end
where primarykey = 17177
私はちょうどスーパースタックになっていますが、私はより多くのコード例を提供します。
条件が満たされた場合、私は本当に実際の結合がほしいと思うでしょう。これは可能なのでしょうか?
更新は
期待される結果は、次のようになりますSWEの答えは1
HistoryID Action Table PrimaryKey Field OldValue NewValue User DateTime StatusFrom StatusTo
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
240233 Added QueueItem 17177 QueueItemID 17177 XXXXXXXXXXXXXXX 2016-09-16 08:38:58.060 NULL NULL
240237 Modified QueueItem 17177 StatusTypeID 1 2 XXXXXXXXXXXXXXX 2016-09-16 08:38:59.163 New Building
240240 Modified QueueItem 17177 StatusTypeID 2 3 XXXXXXXXXXXXXXX 2016-09-16 08:39:00.850 Building Ready
240241 Modified QueueItem 17177 PackageID 0 XXXXXXXXXXXXXXX 2016-09-16 08:39:00.850 NULL NULL
240249 Modified QueueItem 17177 StatusTypeID 3 4 XXXXXXXXXXXXXXX 2016-09-16 08:39:09.207 Ready Processing
240256 Modified QueueItem 17177 StatusTypeID 4 5 XXXXXXXXXXXXXXX 2016-09-16 08:39:10.163 Processing Done
240257 Modified QueueItem 17177 OutputDateTime 9/16/2016 8:39:10 XXXXXXXXXXXXXXX 2016-09-16 08:39:10.163 NULL NULL
、私もこれを試してみました:
select h.*, so.[Name] as StatusFrom, sn.[Name] as StatusTo from history h
left outer JOIN StatusType so on so.StatusTypeID = Convert(int, h.NewValue) and h.field = 'statustypeid'
left outer JOIN StatusType sn on sn.StatusTypeID = Convert(int, h.NewValue) and h.field = 'statustypeid'
where primarykey = 17177
を、私は同じ問題を取得する - それがヒットしたときに転倒しますnewValueフィールドの日付
は、条件がすべてのレコードを除外だけそれらがnullことはありません、あなたに参加します。それはあなたが望む/期待したものですか? – GuidoG
はい。すべての履歴を取り戻す必要がありますが、statusTypeのフィールドがある場合は、ステータステーブルに参加してテキスト名を取得します。 – Darren
申し訳ありませんが、私は期待どおりの結果を見ません。 –