Sql 如何从此结果中删除重复项

Sql 如何从此结果中删除重复项,sql,sql-server,database,Sql,Sql Server,Database,如何从此结果中删除重复项 select *, row_number() over (order by (select null)) as seqnum from [elo].[dbo].[objkeys] where parentid in (select parentid from [elo].[dbo].[objekte] inner join [elo].[dbo].[objkeys] on ob

如何从此结果中删除重复项

select *,
       row_number() over (order by (select null)) as seqnum
from [elo].[dbo].[objkeys] 
where parentid in (select parentid
                   from [elo].[dbo].[objekte] 
                   inner join [elo].[dbo].[objkeys] on objid = parentid 
                   where objmask like 26 and okeydata like 'yes'
                   )
输出为

parentid   okeyname  okeydata
  1          name   a
  1      number     1
  1        yes_no   yes 
  2          name   a
  2      number     1
  2        yes_no   yes
  3          name   a
  3      number     1
  3        yes_no   no
  4          name   a
  4      number     2
  4          yes_no no
  5          name   b
  5      number     3
  5          yes_no yes
  6          name   b
  6      number     3
  6          yes_no yes
  7          name   b
  7      number     3
  7          yes_no no
  8          name   b
  8      number     3
  8          yes_no no

需要像这样

parentid   okeyname  okeydata
  1          name   a
  1      number     1
  1          yes_no yes 

  3          name   a
  3      number     1
  3          yes_no no

  5          name   b
  5      number     3
  5          yes_no yes


  7          name   b
  7      number     3
  7          yes_no no
试试下面-

select * from
(
      select *,row_number() over (partition by okeyname,okeydata order by parentid) as seqnum
      from [elo].[dbo].[objkeys] inner join [elo].[dbo].[objekte]
      on objid = parentid 
      where objmask like 26 and okeydata like 'yes'
)A where seqnum=1

似乎没有任何重复记录,但从resut集合来看,您似乎需要最小的parentid,并尝试如下操作

    with cte as
    (
    your query output
    ) select min(parentid),okeyname,okeydata
   from cte group by okeyname,okeydata

如果可以忽略“parentid”,则可以使用下面的代码

select distinct okeyname, okeydata, 
             row_number() over (order by (select null)) as seqnum
      from [elo].[dbo].[objkeys] 
      where parentid in (select parentid
                         from [elo].[dbo].[objekte] inner join
                              [elo].[dbo].[objkeys] 
                               on objid = parentid 
                         where objmask like 26 and okeydata like 'yes'
                        )

我认为数据透视是一种更好的格式,让您可以轻松地做您想做的事情。首先要关注的是:

select parentid,
       max(case when okeyname = 'name' then okeydata end) as name,
       max(case when okeyname = 'number' then okeydata end) as number,
       max(case when okeyname = 'yes_no' then okeydata end) as name
from [elo].[dbo].[objkeys]
group by parentid ;
然后,要获取第一个parentid,请使用子查询:

select min(parentid) as parentid, name, number, yes_no
from (select parentid,
             max(case when okeyname = 'name' then okeydata end) as name,
             max(case when okeyname = 'number' then okeydata end) as number,
             max(case when okeyname = 'yes_no' then okeydata end) as yes_no
      from [elo].[dbo].[objkeys]
      group by parentid
     ) p
group by name, number, yes_no;
如果需要原始格式,则取消PIVOT:

select nny.parentid, v.*
from (select min(parentid) as parentid, name, number, yes_no
      from (select parentid,
                   max(case when okeyname = 'name' then okeydata end) as name,
                   max(case when okeyname = 'number' then okeydata end) as number,
                   max(case when okeyname = 'yes_no' then okeydata end) as yes_no
            from [elo].[dbo].[objkeys]
            group by parentid
           ) p
      group by name, number, yes_no
     ) nny cross apply
     (values ('name', name), 
             ('number', number),
             ('yes_no', yes_no)
     ) v(okeyname, okeydata)

你能解释一下吗?我看不到任何重复,因为所有的行都针对不同的id。okeyname['name']=ayes id中的属性为dublicate的id未dublicated,但okeydata中的数据为dublicate。为什么有父id为3的行存在?它的名字是“a”,因为“是”和“否”是不同的