2017-10-05 3 views
1

私はこのコードを持っている:T-SQLの戻りMAXフィールド

SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' 
FROM Log 
WHERE UserID <> 0 
GROUP BY ItemID, UserID` 

さて、これは、特定の項目のための最新のログエントリにユーザーIDを返します。

SELECT it.ItemID, it.ItemName, UA.UserID 
FROM ItemTable it LEFT JOIN 
    (SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' 
     FROM Log 
     WHERE UserID <> 0 
     GROUP BY LogID, UserID 
    ) AS UA 
    ON it.ItemID = UA.ItemID 

このコードで何が起こることが最大LogIDsのために返すことである:それは私がそうのように、との接合てるアイテムIDを持っていることを別のテーブルに参加するとき、私はそれは同じことをするだろうと仮定したいですItemを変更した各ユーザーは、Max LogIDの代わりに、私が想定していた通りです。私はここで何が欠けていますか?

私はまた、ログテーブルのLogIDを入力してuserIDと戻り値を返すScalar Functionを作成しましたが、実行した後は本当に悪くなりますが、それはすべてのLogIDを照会する最初のテーブルからItemIDを結合します。

DECLARE @UID INT 
SELECT @UID = al.UserID FROM Log al WHERE al.LogID = @theID 
RETURN @UID 

そしてそうのようにそれを使用します。

SELECT ItemID, ItemName, UDFGetModBy(MAX(UA.LogID)) FROM ItemTable it 
LEFT JOIN (SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' FROM Log WHERE UserID <> 0 
GROUP BY LogID, UserID) AS UA ON it.ItemID = UA.ItemID 

項目表のスキーマはで構成されていますItemID, ItemName, CreatedDate
ログテーブルスキーマの構成は次のとおりです。LogID, ItemID (FK to Item Table), DateModified, UserID

予想される出力は次のようになります。it.ItemID, it.ItemName, al.UserID, al.DateModified

さらに明確にするために、Log Tableは毎回新しいLogIDを保存しますシステム外のユーザー(UserID <> 0)がemを変更しました。

SELECT it.ItemID, it.ItemName, UID = 
(SELECT al.UserID, MAX(al.LogID) AS 'LID' FROM Log al) 
WHERE al.UserID <> 0 AND it.ItemID = al.ItemID) 
FROM ItemTable it 

しかし、私は only one expression can be specified in the select list when the subquery is not introduced with EXISTSエラーに

任意の提案をしてください取得:

も試してみましたか?

+3

'Item'と' Log'テーブル 'Schema'と' Data'を共有します。そして期待される 'アウトプット'。 –

+0

これを行うために派生テーブルが必要なのかどうかはわかりません。そしてそれはそれを遅くするでしょう、あなたは機能の中でそれを一つずつやっていて、それを基にしてそれを取り除いています。 – Leonidas199x

+0

私は答えようとしましたが、最初にテーブル定義が必要であることが分かりました。 –

答えて

1

select内のデータをフィルタリングする必要があります。これは次のようなものです:

SELECT ItemID, ItemName, UDFGetModBy(MAX(UA.LogID)) FROM ItemTable it 
OUTER APPLY (SELECT ItemID, UserID, MAX(LogID) AS 'LatestLog' FROM Log WHERE 
UserID <> 0 and ItemID = it.ItemID GROUP BY ItemID, UserID) 

サブクエリでデータをフィルタリングすることができます。

1

は、最後に私はあなたがサブクエリで、このようにそれを行うことができます考え出し:

SELECT TOP 1 * FROM ItemTable ORDER BY DESC 

これは私が探していた全体の「LatestLog」行をつかみます。それが最適かどうかは分かりませんが、現在はうまくいきます。

関連する問題