2016-01-14 3 views
1

У меня есть SQL таблица, что выглядит следующим образом:SQL 1 строка дважды

+----------+-----------+ 
| ID  | Direction | 
+----------+-----------+ 
| 1  | left  | 
| 1  | null  | 
| 2  | left  | 
| 2  | null  | 
| 3  | null  | 
| 4  | left  | 
| 4  | null  | 
| 5  | null  | 
+----------+-----------+ 

Я хочу показать каждое значение только один раз:

  • Если будет ID 1 с направлением null и left, то показать только ID 1 с направлением left.
  • Если будет ID 1 только с null значение, показать его null значение.

enter image description here

+0

Может 'Direction' принимать любые другие ценности? –

+0

Нет, только левое значение или null. – Avrack

+0

внешний вид включен в ваш вопрос, потому что он показывает полезную информацию. –

ответ

3

использовать выражение общей таблицы (КТР):

with cte as 
(
    Your huge select... 
) 
select * 
from cte t1 
where t1.Direction = 'left' 
    or not exists (select * from cte t2 
       where t2.kanbanid = t1.kanbanid 
        and t2.Direction = 'left') 

Т.е. если ваш выбор имеет направление «левый» для канбанида, верните эту строку. Также верните эту строку, если тот же самый kanbanid не имеет направления «left» вообще.

+0

Все еще имеют значения (слева и нуль) :( – Avrack

+0

Для того же id?!? – jarlh

+0

Да ... Может быть проблема с таблицами? У меня есть идентификатор из другой таблицы, кроме Direction. – Avrack

0

выбрать отличные *, row_number() над (разделом по приказу ид по направлению,), как row1 в #any_table из #your_table_name

выберите * из #any_table где row1 = 1

1

Почему обыкновение ниже работы запроса:

select id,max(dir) 
from #temp 
group by id 

ниже тестовые данные:

create table #temp 
(
id int, 
dir char(10) 
) 

insert into #temp 
select 1,'left' 
union all 
select 1,null 
union all 
select 2,null 
union all 
select 3,'right' 
union all 
select 3,null 
union all 
select 3,null 


select id,max(dir) 
from #temp 
group by id 

агрегатные функции будут игнорировать нуль, ниже выход:

enter image description here

+0

Изображения блокируются в моем брандмауэре, поэтому Я не могу видеть вывод. Но в соответствии с описанием вам нужно одно значение, если оно имеет значение, отличное от нуля, если оно имеет только null.then show null – TheGameiswar

+0

Собирался опубликовать этот же ответ. Но с SQL почти обязательно говорить о конкретной используемой БД. Это же решение для меня работало на SQLite. Кажется, ваша БД тоже работает отлично. –

Смежные вопросы