在此之前,我不想重寫。這是提供給我的,我似乎無法弄清楚這是一個普遍的錯誤還是由於腳本的特殊性而發生的某種語法瘋狂。好吧有與設置上說:這個子查詢爲什麼不起作用?
的Microsoft SQL Server標準版(64位)
版本10.50.2500.0
在位於一個普通的表數據庫,定義爲:
CREATE TABLE [dbo].[Regions](
[RegionID] [int] NOT NULL,
[RegionGroupID] [int] NOT NULL,
[IsDefault] [bit] NOT NULL,
CONSTRAINT [PK_Regions] PRIMARY KEY CLUSTERED
(
[RegionID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
個插入一些值:
INSERT INTO [dbo].[Regions]
([RegionID],[RegionGroupID],[IsDefault])
VALUES
(0,1,0),
(1,1,0),
(2,1,0),
(3,2,0),
(4,2,0),
(5,2,0),
(6,3,0),
(7,3,0),
(8,3,0)
現在運行查詢(從每個組中選擇一個,切記不重寫建議!):
SELECT RXXID FROM (
SELECT
RXX.RegionID as RXXID,
ROW_NUMBER() OVER (PARTITION BY RXX.RegionGroupID ORDER BY RXX.RegionGroupID) AS RXXNUM
FROM Regions as RXX
) AS tmp
WHERE tmp.RXXNUM = 1
你應該得到:
RXXID
-----------
0
3
6
現在堅持下去Ë更新語句(與預設爲0,畢竟一個選擇):
UPDATE Regions SET IsDefault = 0
UPDATE Regions
SET IsDefault = 1
WHERE RegionID IN (
SELECT RXXID FROM (
SELECT
RXX.RegionID as RXXID,
ROW_NUMBER() OVER (PARTITION BY RXX.RegionGroupID ORDER BY RXX.RegionGroupID) AS RXXNUM
FROM Regions as RXX
) AS tmp
WHERE tmp.RXXNUM = 1
)
SELECT * FROM Regions
ORDER BY RegionGroupID
並得到這樣的結果:
RegionID RegionGroupID IsDefault
----------- ------------- ---------
0 1 1
1 1 1
2 1 1
3 2 1
4 2 1
5 2 1
6 3 1
7 3 1
8 3 1
ZOMG跆拳道lamaz?
雖然我不聲稱是SQL大師,但這看起來既不合適也不正確。而爲了讓事情變得更加瘋狂,如果你刪除主鍵似乎工作:
刪除主鍵:
IF EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[Regions]') AND name = N'PK_Regions')
ALTER TABLE [dbo].[Regions] DROP CONSTRAINT [PK_Regions]
並重新運行update語句集,結果是:
RegionID RegionGroupID IsDefault
----------- ------------- ---------
0 1 1
1 1 0
2 1 0
3 2 1
4 2 0
5 2 0
6 3 1
7 3 0
8 3 0
這不是嗎?
有沒有人有任何線索這裏發生了什麼?我的猜測是某種子查詢緩存,這是一個錯誤嗎?它肯定不像SQL 應該做什麼?
這是BTW一個很有趣的問題! – cairnz 2012-03-23 20:39:10