在這裏你去:
DECLARE @t TABLE
(
id INT,
Name VARCHAR(20),
Role INT
)
INSERT INTO @t
SELECT ROW_NUMBER() OVER(ORDER BY Names.CustomerID, Roles.Role), Names.Name, Roles.Role
FROM @names AS Names
INNER JOIN @roles AS Roles ON Roles.CustomerId = Names.CustomerId
UPDATE @t
SET Name = NULL
FROM @t Temp1
WHERE EXISTS(SELECT TOP 1 1 FROM @t Temp2 WHERE Temp2.Name = Temp1.Name AND Temp2.id < Temp1.id)
SELECT * FROM @t
更換@Names
和@Roles
與表定義。
你也可以用temp tables
或recursive CTE
或cursors
做到這一點,但一個簡單的表變量將會很好。
僅供參考,我的測試代碼:
DECLARE @names TABLE
(
CustomerId INT,
Name VARCHAR(20)
)
DECLARE @roles TABLE
(
CustomerId INT,
Role INT
)
INSERT INTO @names VALUES (1, 'pete'), (2, 'dave'), (3, 'jon')
INSERT INTO @roles VALUES (1, 1), (1, 2), (2, 1), (3, 2), (3,3)
-- rest of query
我的結果與你不同,我懷疑你有一個錯字與第一null
和dave
被周圍交換交換:
Name, Role
pete 1
null 2
dave 1
jon 2
null 3
編輯:已經想過這個問題,你其實可以不用臨時表做它在所有:
SELECT CASE WHEN row_no = 1 THEN Name ELSE NULL END AS Name, Role
FROM
(
SELECT ROW_NUMBER() OVER(PARTITION BY Names.CustomerID ORDER BY Names.CustomerID, Roles.Role) As row_no, Names.Name, Roles.Role FROM @names AS Names
INNER JOIN @roles AS Roles ON Roles.CustomerId = Names.CustomerId
) x
不明白期望的結果是如何得到的。 –
我也不這樣多數民衆贊成爲什麼我發佈它在論壇上:-) – Exitos
我的意思是你用什麼邏輯來定義你想要的結果?我不清楚爲什麼'角色= 1'有'皮特,null'但'角色= 2'有'戴夫,jon'(我看到答案你接受的回報從你說的話你想反正不同的東西!) –