私はこのコードを持っている: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
エラーに
任意の提案をしてください取得:
も試してみましたか?
'Item'と' Log'テーブル 'Schema'と' Data'を共有します。そして期待される 'アウトプット'。 –
これを行うために派生テーブルが必要なのかどうかはわかりません。そしてそれはそれを遅くするでしょう、あなたは機能の中でそれを一つずつやっていて、それを基にしてそれを取り除いています。 – Leonidas199x
私は答えようとしましたが、最初にテーブル定義が必要であることが分かりました。 –