Trước khi có bất cứ điều gì, tôi không tìm kiếm viết lại. Điều này đã được trình bày cho tôi, và tôi dường như không thể tìm ra nếu đây là một lỗi nói chung hoặc một số loại craziness cú pháp xảy ra do sự khác biệt của kịch bản. Tạm bằng lòng với những gì đã nói trên với các thiết lập:Tại sao truy vấn phụ này dường như không hoạt động?
Microsoft SQL Server Standard Edition (64-bit)
Version 10.50.2500.0
Trên bàn nằm trong một chung cơ sở dữ liệu, được định nghĩa là:
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]
chèn một số giá trị:
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)
Bây giờ chạy các truy vấn (để chọn một duy nhất từ mỗi nhóm, hãy nhớ không có lời đề nghị viết lại!):
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
Bạn sẽ nhận được:
RXXID
-----------
0
3
6
Bây giờ hãy dính vào e một báo cáo cập nhật (với bộ tuỳ chọn để 0 và chọn tất cả sau khi):
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
và nhận được kết quả này:
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 wtf lamaz?
Mặc dù tôi không tuyên bố là một guru SQL, điều này có vẻ không đúng và cũng không chính xác. Và để làm những việc điên rồ hơn, nếu bạn thả phím chính nó có vẻ làm việc:
Drop khóa chính:
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]
và chạy lại bản cập nhật tuyên bố thiết lập, kết quả:
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
Đó không phải là ab?
Có ai có bất kỳ đầu mối nào đang xảy ra ở đây không? Đoán của tôi là một số loại bộ nhớ đệm truy vấn phụ và đây có phải là lỗi không? Nó chắc chắn không giống như những gì SQL nên được làm?
Đây là btw một câu hỏi rất thú vị! – cairnz