I'm having an issue with some CTE code I'm working with. My current goal is that I have a table that has a 'Type' column. I want to select all the DISTINCT types from that 'Type' column and, for each type, assign a value of NEWID() to a separate column.
Heres a sample table that im starting with:
| Type | NEW ID |
|---|---|
| 1 | NULL |
| 1 | NULL |
| 4 | NULL |
| 4 | NULL |
| 4 | NULL |
| MA | NULL |
| MA | NULL |
WITH unique_gen_id AS (
SELECT DISTINCT type, NEWID() AS unique_id
FROM tmp
)
UPDATE t
SET t.unique_id = u.unique_id
FROM tmp t INNER JOIN
unique_gen_id u ON t.type = u.type
This query almost works-- it assigns a "NEWID()" unique value to each respective "Type" with a few mishaps. (Type is not specific to either an int or character, could be anything).
| Type | NEW ID |
|---|---|
| 1 | B280347A-C394-4656 |
| 1 | B280347A-C394-4656 |
| 4 | C03F0E24-7187-4CC2 |
| 4 | D10415A8-55BD-4251 |
| 4 | D10415A8-55BD-4251 |
| MA | DBE92CA0-B440-484D |
| MA | DBE92CA0-B440-484D |
As you can see, the query returned almost fine. It failed, however, with "Type" of '4' as it assigned 2 separate 'NEWIDS()' when its supposed to match all the way through.
It gets worse with different data-- I tried on different data using different 'Types' (For example, I had 100 records with Type of "1" that returned 100 unique IDs for each record when its supposed to be 1 NEWID() for all of Type "1", then a new NEWID() for a different type etc etc) and it was catastrophic.
The problem is that your CTE isn't returning distinct IDs.
DISTINCTapplies to the entireSELECTlist, not just the following column. SinceNEWID()returns a different ID for each row, you get duplicate types because they have different IDs.Instead of
SELECT DISTINCT, useGROUP BY typeto get one row per type. Use an aggregation function such asMAX()orMIN()to pick one of the IDs.