2016-05-04 13 views
0

これはタイトルで説明するのがむしろ複雑です。SQL Server:TOPレコードを選択し、別のテーブルで結果を更新する

私は2つのテーブルを持っています.1つはユーザーがWeb訪問を入力し、もう1つは最後のログイン日を格納するフィールドを持つユーザーテーブルです。

私は、彼らがユーザテーブルに登録されている場合には、各ユーザーによる最新のユーザー訪問(上の最後にログインした日時をベースにする

これは、ストアドプロシージャ内のユーザーになります

注:。。I関連する列にテーブルを省略している。

TABLE [Login]

[User] [VARCHAR](15) NOT NULL, 
    [LogOn_Date] [DATETIME] NOT NULL 

TABLE [Users]

[User] [varchar](15) NOT NULL, 
    [Last_Login_Dt] [datetime] NULL 

私は、ユーザーにマッチし[Last_Login_Dt]列で[LogOn_Date]値でUsersテーブルを更新し、Loginの表に、各ユーザから最新の日付[LogOn_Date]を選択するために探しています。

注:ログオンするすべてのユーザーがUsersテーブルにあるわけではありませんが、ユーザーであるかどうかにかかわらず、Windows認証で全員を追跡しますが、usersテーブルに存在する各ユーザーのみを更新します。

ありがとうございました!

答えて

0

私はあなたがユーザーの最後のログインフィールドを持っていないことをお勧めします表。パフォーマンスに関する懸念がある場合を除き、インデックス付きのビューを提案します。あなたは本当に私はあなたの仕事のための基礎として、上記のSQLステートメントを使用することを示唆しているユーザーの表では、このデータを永続化したい場合は

ビューは

Select 
    U.User, Max(L.LogOnDate) 
    From Users U 
    Join Login L On L.User = U.User 

ようになります。ユーザーテーブルを更新するにはいくつかの方法があります。最高のものは、結合を伴う更新ステートメントです。

http://www.tech-recipes.com/rx/56823/delete-update-rows-using-inner-join-sql-server/

+0

Users.User 'は、集計関数またはGROUP BY句に含まれていないため、選択リストでは無効です。私は、ユーザーテーブルでその列を使用しないようにするが、そのストアドプロシージャは、X日間アクティブでない場合、そのユーザーアカウントを無効にします。私たちはDBチーム全体を失い、.Net開発者はすべてをやっている。 –

+1

@MichaelHartmannあなたはクエリの最後に 'Group By U.User'を追加するだけですが、上記のあなたのコメントに基づいて、テーブルを更新して、ユーザーを非アクティブ化するproc。更新し、Last_Login_Dtフィールドをチェックするのは、非アクティブ化クエリで 'MAX(LogOn_Date)'を取得するよりも時間がかかります。 – JamieD77

+0

Joeの見解はうまくいきますが、あなたが示唆するようにするのが理想的ですが、私はそのビューをユーザを無効にするSPとどのように組み合わせるか分かりません。私たちのSQLスタッフ全員が移動され、.NET開発者は私たち自身に任せました。 @ jamieD77 –

0
UPDATE u 
SET u.Last_Login_Dt = l.LogOn_Date 
FROM Users u 
JOIN (SELECT *, 
     ROW_NUMBER() OVER (PARTITION BY User, ORDER BY LogOn_Date DESC) AS rn 
     FROM Login) l ON u.user = l.user and l.rn = 1 

派生テーブルは、ユーザーログインの日付をランク付けします。ユーザーにそれをバックに参加だけでランク最新のログインで1引っ張ると、ユーザーテーブルに更新

+0

あなたはこれが何をするかを拡張してください、それがOPをどのように対処するかができますか? –

+0

@RoYoMi派生テーブルは、日付別にユーザーのログインをランク付けします。それをユーザーに戻しますが、最も最近のログインであるランク1を引き出し、ユーザー表を更新します。 – SQLChao

1

問合せ:

UPDATE u 
SET u.Last_Login_Dt = l.LogOn_Date 
FROM Users u 
JOIN (SELECT 
     [User], 
     max(LogOn_Date) AS LogOn_Date 
     FROM Login 
     GROUP BY [User]) l ON u.[User]= l.[User] 
0
update [Users] 
set [Last_Login_Dt] = a.Last_Login_Dt 
from 
    (select [User], max([Login_date]) as Last_Login_Dt 
    from Login 
    group by [User]) a 
join [SampleDb].[dbo].[Users] b on a.[User] = b.[User] 
関連する問題