ОБРАЗЦА ТАБЛИЦА
CREATE TABLE #TEMP(COLUMNA INT,COLUMNB VARCHAR(30),COLUMNC VARCHAR(30))
INSERT INTO #TEMP
SELECT 111, Null, 'AA'
UNION ALL
SELECT 111, Null, 'BB'
UNION ALL
SELECT 222, Null, 'CC'
UNION ALL
SELECT 333, '555,222', 'DD'
UNION ALL
SELECT 444, Null, 'EE'
UNION ALL
SELECT 666, '777', 'FF'
UNION ALL
SELECT 888, '777', 'GG'
QUERY
Я написал логику внутри запроса
;WITH CTE AS
(
-- Get the CSV as rows and count the occurance of ColumnA
SELECT COLUMNA,LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'COLUMNB',COLUMNC,
COUNT(COLUMNA) OVER(PARTITION BY COLUMNA) CNT
FROM
(
-- Select the values to convert into rows from CSV
SELECT COLUMNA,
CAST ('<M>' + REPLACE(ISNULL(COLUMNB,''), ',', '</M><M>') + '</M>' AS XML) AS Data,
COLUMNC
FROM #TEMP
) AS A
CROSS APPLY Data.nodes ('/M') AS Split(a)
)
-- Find the rows where number of each unique item in ColumnA > 1
-- and ColumnA element exists in ColumnB
SELECT DISTINCT T.*
FROM CTE C
JOIN #TEMP T ON C.COLUMNA=T.COLUMNA
WHERE CNT > 1
OR C.COLUMNA IN (SELECT DISTINCT COLUMNB FROM CTE)
РЕЗУЛЬТАТ
EDIT
Если вы хотите, чтобы получить записи, когда только оба условия удовлетворяют, используйте AND
вместо OR
в последней строке, т.е.
AND C.COLUMNA IN (SELECT DISTINCT COLUMNB FROM CTE)
Если вы размещаете ваши попытки это проще исправить, чем переписать его с нуля ... –