我懷疑你正在尋找一個排名功能,或每用戶甚至一個簡單的COUNT(*)
? MySQL在analytic,ranking或窗口函數中相當差,所以使用諸如奇怪更新或觸發器等技巧來模擬它們。
在SQL Server中,你可以返回的單個用戶與COUNT()
每一行應用在單個用戶相匹配的記錄相匹配的記錄數:
SELECT *, COUNT(*) OVER (PARTITION BY WATCHLIST_USER)
FROM TF_WATCHLIST_PERSISTENCE
無需觸發。您可以使用任何具有OVER()子句的聚合。
如果您想按照某種順序排列排名,您可以使用ROW_NUMBER()
或RANK()等排名函數之一。如果要計算基於每個用戶的一排位置,例如在創建日期,你可以寫:
SELECT *, ROW_NUMBER(*) OVER (PARTITION BY WATCHLIST_USER ORDER BY CreationDate)
FROM TF_WATCHLIST_PERSISTENCE
如果你有,你可以用它來生成一個row position
每用戶
SELECT *, ROW_NUMBER(*) OVER (PARTITION BY WATCHLIST_USER ORDER BY ID)
FROM TF_WATCHLIST_PERSISTENCE
一個遞增的ID大多數時候,你不需要需要存儲的行位置。向查詢添加排名功能很簡單。
如果你需要存儲在表中這樣的行位置,你可以使用一個簡單的多行觸發器
CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION
ON TF_WATCHLIST_PERSISTENCE
AFTER INSERT, UPDATE
AS
update TF_WATCHLIST_PERSISTENCE
set WATCHLIST_POSITION =ROW_NUMBER() OVER (PARTITION BY WATCHLIST_USER ORDER BY ID)
FROM inserted
INNER JOIN TF_WATCHLIST_PERSISTENCE on inserted.ID=TF_WATCHLIST_PERSISTENCE.ID
或者
update TF_WATCHLIST_PERSISTENCE
set WATCHLIST_POSITION =ROW_NUMBER() OVER (PARTITION BY WATCHLIST_USER ORDER BY ID)
FROM inserted
INNER JOIN TF_WATCHLIST_PERSISTENCE
ON inserted.WATCHLIST_USER =TF_WATCHLIST_PERSISTENCE.WATCHLIST_USER
如果要插入新的條目現有用戶並重新計算所有職位
嘗試:'CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION INSERT ON TF_WATCHLIST_PERSISTENCE 之後開始 UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =(SELECT COUNT(*) - 1 FROM TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = inserted.WATCHLIST_USER) WHERE ROWID =插入.rowid和inserted.WATCHLIST_POSITION爲空' – TheGameiswar
謝謝......但我的Management Studio不接受語法。 如果我把它改寫這樣的,它變得更好: CREATE TRIGGER TF_WATCHLIST_PERSISTENCE_ADD_POSITION ON TF_WATCHLIST_PERSISTENCE INSERT ON TF_WATCHLIST_PERSISTENCE之後開始UPDATE TF_WATCHLIST_PERSISTENCE SET WATCHLIST_POSITION =(SELECT COUNT(*) - 1 TF_WATCHLIST_PERSISTENCE WHERE WATCHLIST_USER = inserted.WATCHLIST_USER)WHERE ROWID =插入。 rowid並插入。WATCHLIST_POSITION爲空 但是,它預計「AS,NOT_FOR,With」 –
您使用的是ssms嗎? – TheGameiswar