Выберите отдельные строки на основе столбца и двух условий в SQL - PullRequest
0 голосов
/ 26 июня 2018

Я хотел бы получить строки из этого набора данных, где существует значение T1 / T3, но для соответствующего идентификатора не существует значения T2 / T3.

ID  sample1 sample2 value
A_000002    T2  T3  -0.934119
A_000002    T1  T3  -0.866637
A_000029    T2  T3  -1.07677
A_000037    T2  T3  -0.76506
A_000057    T1  T3  -5.34988

Я бы хотел сказать что-то вроде:

SELECT * FROM table
WHERE DISTINCT ID
AND sample_1 == "T1"
AND sample_2 == "T3"

... и вернуть только следующее, потому что для этого идентификатора нет соответствующей строки T2 / T3:

A_000057    T1  T3  -5.34988

Если я использую условия sample_1 и sample_2, я все равно получаю различные значения, потому что он отфильтровывает значения "T2" перед проверкой, является ли идентификатор отличным.

Самое близкое, что я получил, - это сделать 3 таблицы с возможными комбинациями T1 / T2 / T3 и экраном НЕ СУЩЕСТВУЕТ T1T2.ID = T2T3.ID

select * from T1T2
where not exists (select * from T2T3 where T2T3.id = T1T2.id)
and not exists (select * from T1T3 where T1T3._id = T1T2.id)
order by id

Я не уверен, что пока доверяю коду.

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

Я бы использовал not exists:

SELECT t.*
FROM table t
WHERE t.sample_1 = 'T1' AND t.sample_2 = 'T3' AND
      NOT EXISTS (SELECT 1 FROM table t2 WHERE t2.id = t.id);
0 голосов
/ 26 июня 2018

Вы можете использовать эту технику, основанную на внешнем соединении:

select t1.*
from table t1
left join table t2
on t2.id = t1.id
  and t2.sample1 = 'T2' and t2.sample2 = 'T3'
where t1.sample1 = 'T1' and t1.sample2 = 'T3'
and t2.id is null

Это работает, потому что внешние объединения возвращают пустые значения, если соединения нет, и вы возвращаете только те, которые указаны с помощью условия t2.id is null в предложении where.

Большим преимуществом этого метода является эффективное использование индекса в столбце id; эта техника, как правило, превзойдет другие аплодисменты. Плюс ИМХО, это более аккуратный запрос.

Обратите внимание, что условие для столбцов sample должно быть в условии join для t2, в противном случае вы фактически получите inner join, победив требуемый внешний присоединиться.

0 голосов
/ 26 июня 2018

Здесь будет работать неприлично:

Выберите отдельный идентификатор * из таблицы Где sample1 = 't1' и sample2 = 't3'

0 голосов
/ 26 июня 2018

Вы можете использовать not exists:

select t.*
from table t
where (sample1 = 'T1' and sample2 = 'T3') and
       not exists (select 1 
                   from table t1 
                   where t1.id = t.id and 
                         t1.sample1 = 'T2' and t1.sample2 = 'T3'
                  );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...