Как получить строки без повторяющихся ячеек в наборе результатов - PullRequest
1 голос
/ 17 октября 2019

Я хочу получить строку с уникальными значениями: Пример: В первой строке name1, содержащей «AA», мы должны сравнить «AA» со всеми ячейками таблицы, если она совпадает, мы должны удалить всю строку.

Ниже результата i / p.

   declare @tbl table (ID INT IDENTITY(1,1),Name1 varchar(100),Name2 
   varchar(100),Name3 varchar(100)) 
   insert into @tbl 
   select 'AA' ,'AB','AC'
   UNION ALL
   SELECT 'BA','BB','AA'
   UNION ALL
   SELECT 'CA','CB','CC'
   UNION ALL
   SELECT 'DA','DB','DD'
   UNION ALL
   SELECT 'EA','AB','EC'
   UNION ALL
   SELECT 'CC','FB','FC' 
   SELECT * FROM @tbl

Ввод: не учитывать столбец идентификатора.

ID  Name1   Name2   Name3
1     AA       AB      AC
2     BA       BB      AA
3     CA       CB      CC
4     DA       DB      DD
5     EA       AB      EC
6     CC       FB      FC

ожидаемый результат o / p:

ID  Name1   Name2   Name3
4     DA      DB      DD


declare @tbl table (ID INT IDENTITY(1,1),Name1 varchar(100),Name2 varchar(100),Name3 varchar(100)) 
insert into @tbl 
select 'AA' ,'AB','AC'
UNION ALL
SELECT 'BA','BB','AA'
UNION ALL
SELECT 'CA','CB','CC'
UNION ALL
SELECT 'DA','DB','DD'
UNION ALL
SELECT 'EA','AB','EC'
UNION ALL
SELECT 'CC','FB','FC' 
SELECT * FROM @tbl a join @tbl b on a.name1<>b.name2 and a.name1<>b.name3 and a.Name2<>b.name3

1 Ответ

0 голосов
/ 17 октября 2019

Код ниже возвращает желаемые результаты. Если он не может соединить значения Name1, Name2 или Name3 строки со значениями Name1, Name2 или Name3 в любой другой строке, тогда значения должны быть уникальными.

declare @tbl table (
    ID INT IDENTITY(1,1),
    Name1 varchar(100),
    Name2 varchar(100),
    Name3 varchar(100)
);

insert into @tbl values
    ('AA', 'AB', 'AC'),
    ('BA', 'BB', 'AA'),
    ('CA', 'CB', 'CC'),
    ('DA', 'DB', 'DD'),
    ('EA', 'AB', 'EC'),
    ('CC', 'FB', 'FC');

select T1.*
from @tbl T1
left join @tbl T2 on T2.ID != T1.ID and (
    (T1.Name1 in (T2.Name1, T2.Name2, T2.Name3))
    or (T1.Name2 in (T2.Name1, T2.Name2, T2.Name3))
    or (T1.Name3 in (T2.Name1, T2.Name2, T2.Name3))
    )
where T2.ID is null;

=== edit ===

Чтобы игнорировать повторяющиеся значения в любом месте таблицы, даже если они находятся в одной строке, попробуйте эту версию вместо ...

declare @tbl table (
    ID INT IDENTITY(1,1),
    Name1 varchar(100),
    Name2 varchar(100),
    Name3 varchar(100)
);

insert into @tbl values
    ('AA', 'AB', 'AC'),
    ('BA', 'BB', 'AA'),
    ('CA', 'CB', 'CC'),
    ('DA', 'DB', 'DD'),
    ('EA', 'AB', 'EC'),
    ('CC', 'FB', 'FC');

;with UniqueValues as (
    select Value
    from (
        select Value=Name1 from @tbl
        union all
        select Value=Name2 from @tbl
        union all
        select Value=Name3 from @tbl
    ) D
    group by Value
    having count(1)=1
)
select T1.*
from @Tbl T1
join UniqueValues U1 on U1.Value=T1.Name1
join UniqueValues U2 on U2.Value=T1.Name2
join UniqueValues U3 on U3.Value=T1.Name3;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...