Получить уникальные строки, проверяя значения столбцов sql - PullRequest
0 голосов
/ 13 января 2019

Я очень плохо знаком с SQL, поэтому извините, если вы посчитаете глупым вопрос.

Таблица

+--------------------+
id   state   isPresent
+--------------------+
id1    1      N
id2    2      N
id2    2      Y
id3    3      N
id4    4      N
id4    4      Y
id5    2      N
id5    2      Y

Мне нужно получить все идентификаторы unidue, где isPresent = N и isPresent = Y для определенного состояния.

Например, если передано 2 (состояние) в качестве параметра для запроса, мы должны получить результат как id2 и id5, поскольку isPresent = "N" и "Y" для этого состояния.

Аналогично, если мы пройдем 4, мы должны получить только id4

с использованием Sybase

Ответы [ 3 ]

0 голосов
/ 13 января 2019

Похоже, простое предложение WHERE с DISTINCT делает то, что вы объяснили.

Вам нужны строки 11 - 14.

SQL> with test (id, state, ispresent) as
  2    (select 'id1', 1, 'N' from dual union all
  3     select 'id2', 2, 'N' from dual union all
  4     select 'id2', 2, 'Y' from dual union all
  5     select 'id3', 3, 'N' from dual union all
  6     select 'id4', 4, 'N' from dual union all
  7     select 'id4', 4, 'Y' from dual union all
  8     select 'id5', 2, 'N' from dual union all
  9     select 'id5', 2, 'Y' from dual
 10    )
 11  select distinct id
 12  from test
 13  where ispresent = 'N'
 14    and state = &par_id;
Enter value for par_id:   2

ID
---
id2
id5

SQL> /
Enter value for par_id: 4

ID
---
id4

SQL>
0 голосов
/ 13 января 2019

Я думаю, что вы хотите вернуть отличный id, при условии, что он имеет оба случая (N и Y) одновременно для столбца isPresent. Итак, рассмотрите возможность использования следующего оператора SQL с оператором exists, изменив параметры (теперь это 2):

with tab(id, state, isPresent) as
(
 select 'id1', 1, 'N'  union all
 select 'id2', 2, 'N'  union all
 select 'id2', 2, 'Y'  union all
 select 'id3', 3, 'N'  union all
 select 'id4', 4, 'N'  union all
 select 'id4', 4, 'Y'  union all
 select 'id5', 2, 'N'  union all
 select 'id5', 2, 'Y' 
)
select distinct id 
  from tab t1
 where exists ( select 1 
                  from tab t2 
                 where t2.state = t1.state 
                   and t2.isPresent in ('N','Y') -- this line might be commented out, if it's certain that there're only two cases "N" and "Y"
                 group by t2.state
                 having count(distinct t2.isPresent) = 2
               )  
   and t1.state = 2 -- try other values also such as 1, 3, 4

Для значений 1 и 3 строка не возвращается, а для 2 и 4 возвращается хотя бы одна строка.

Rextester Demo

0 голосов
/ 13 января 2019

Попробуйте использовать внутреннее соединение, как показано ниже:

SELECT DISTINCT(id)
FROM table t1 INNER JOIN table t2
ON t1.id = t2.id
AND t1.isPresent != t2.isPresent
WHERE state = 2

Мы выполняем внутреннее объединение таблицы, используя поле идентичного идентификатора и поле isPresent, содержащее одно в виде Y, а другое в качестве N. Я жестко закодировал состояние как 2, но вы можете параметризовать его и использовать в подготовленном заявление программно, чтобы передать его динамически.

...