Here is a sample script of thesaurus database where terms and categories are linked to each other.CREATE TABLE #term (termid VARCHAR(8), en VARCHAR(32), enscope VARCHAR(32))CREATE TABLE #link (linkid VARCHAR(10), termid VARCHAR(8), reltype VARCHAR(2), refid VARCHAR(8))CREATE TABLE #categorylink (code VARCHAR(3), termid VARCHAR(8))INSERT INTO #term VALUES ('100', 'ABC', 'abc_scopenote')INSERT INTO #term VALUES ('120', 'DEF', 'def_scopenote')INSERT INTO #term VALUES ('150', 'GHI', NULL)INSERT INTO #link VALUES ('1', '100', 'NT', '120')INSERT INTO #link VALUES ('2', '100', 'NT', '150')INSERT INTO #link VALUES ('3', '120', 'BT', '100')INSERT INTO #link VALUES ('4', '120', 'RT', '150')INSERT INTO #link VALUES ('5', '150', 'BT', '100')INSERT INTO #link VALUES ('6', '150', 'RT', '120')INSERT INTO #categorylink VALUES ('S01', '100')INSERT INTO #categorylink VALUES ('S02', '100')INSERT INTO #categorylink VALUES ('B04', '150')SELECT CASE WHEN #term.enscope IS NULL AND refterm.en IS NULL AND #categorylink.code IS NULL THEN #term.en ELSE NULL END, CHAR(9) + 'SN ' + #term.enscope, CHAR(9) + #link.reltype + CHAR(32) + refterm.en, CHAR(9) + 'CODE ' + #categorylink.code FROM #link INNER JOIN #term ON #term.termid = #link.termid INNER JOIN #term AS refterm ON refterm.termid = #link.refid LEFT JOIN #categorylink ON #term.termid = #categorylink.termid GROUP BY GROUPING SETS (#term.en, (#term.en, #term.enscope), (#term.en, #link.linkid, #link.reltype, refterm.en), (#term.en, #categorylink.code)) ORDER BY #term.en, #categorylink.code, #link.linkid, #term.enscopeGODROP TABLE #termDROP TABLE #linkDROP TABLE #categorylinkGOI want to COALESCE them all into a single column without duplicates.; WITH CTEterm AS ( SELECT ROW_NUMBER() OVER (PARTITION BY #term.en, #term.enscope, refterm.en, #categorylink.termid ORDER BY #term.en) AS rownumber, #term.en AS mainterm, CHAR(9) + 'SN ' + #term.enscope AS scopenote, CHAR(9) + #link.reltype + CHAR(32) + refterm.en AS subterms, CHAR(9) + 'CODE ' + #categorylink.code AS codes FROM #link INNER JOIN #term ON #term.termid = #link.termid INNER JOIN #term AS refterm ON refterm.termid = #link.refid LEFT JOIN #categorylink ON #term.termid = #categorylink.termid)SELECT CASE WHEN rownumber = 1 THEN mainterm ELSE NULL END, scopenote, subterms, codes FROM CTEtermGROUP BY GROUPING SETS ((rownumber, mainterm), (mainterm, scopenote), (mainterm, subterms), (mainterm, codes))ORDER BY mainterm, codes, subterms, scopenoteGO
If there is NULL in 'enscope' I've got a duplicate row.If there is no 'categorylink' value I've got a duplicate row.Any ideas, please?