Выбор строк одинакового значения в colA, но разных значений в colB с условием? - PullRequest
0 голосов
/ 04 октября 2019

У меня есть таблица в SQL Server, которая имеет такую ​​структуру:

id     m_id    r_id
-------------------
1      1       1
2      2       2
3      2       2
4      3       2
5      3       5
6      4       5
7      5       3

Мне нужно выяснить, как я могу получить m_id записей, где r_id отличаются, но имеют только значения2 ИЛИ 5.

Таким образом, запрос приведет к этим строкам

m_id    r_id
-------------
3       2
3       5

Еще лучше, если бы я мог просто получить m_ids, где ставится это условие, чтобы я мог обновить эти записи

m_id
----
3

Кстати, есть ли какие-нибудь полезные ресурсы, такие как книга или веб-сайт, которые я могу прочитать, чтобы я мог хорошо понять основы запросов к БД?

Ответы [ 4 ]

1 голос
/ 04 октября 2019

Вы можете иметь дубликаты. Я думаю, что я бы пошел на:

select m_id
from t
group by m_id
having sum(case when r_id = 2 then 1 else 0 end) > 0 and
       sum(case when r_id = 5 then 1 else 0 end) > 0 and
       sum(case when r_id not in (2, 5) then 1 else 0 end) = 0 ;

Вы также можете сделать это без конструкций агрегации условий:

select m_id
from t
group by m_id
having min(r_id) = 2 and
       max(r_id) = 5 and
       count(distinct r_id) = 2;

Однако это не так легко обобщить на другие значения.

На самом деле, для обобщения вам может понравиться это:

with r as (
      select *
      from (values (2), (5)) v(r_id)
     )
select m_id
from t left join
     r
     on t.r_id = r.r_id
group by m_id
having count(*) = count(r.r_id) and  -- all ids match
       count(distinct t.r_id) = (select count(*) from r);
1 голос
/ 04 октября 2019

Использовать агрегацию:

SELECT m_id
FROM mytable
GROUP BY m_id
HAVING 
    COUNT(*) = 2
    AND MIN(r_id) = 2
    AND MAX(r_id) = 5

Это демонстрация на DB Fiddle с вашими примерами возврата:

| m_id |
| ---: |
|    3 |
0 голосов
/ 05 октября 2019

Я думаю, что мне нравятся другие ответы, вероятно, лучше;но на всякий случай, вот пример использования существует:

declare @table table (m_id int, r_id int)
insert into @table
values (1,2),(2,2),(2,2),(3,2),(3,5),(4,5),(5,3),(4,2),(4,4)

select distinct m_id
from @table t
where exists (select m_id from @table where r_id = 2 and m_id = t.m_id)
   and exists (select m_id from @table where r_id = 5 and m_id = t.m_id)
   and not exists (select m_id from @table where r_id not in (2, 5) and m_id = t.m_id)
0 голосов
/ 05 октября 2019

Вы можете выбрать отличный m_id, который соответствует вашим условиям:

Чтобы сделать это на sql, вы должны сделать (не записано как! - =):

Select DISTINCT(m_id)
FROM TableName
Where m_id != r_id    
and (m_id = 2 or m_id =5)

Где вы берете все m_id, которые отличаются от r_id, а r_id - это только те, которые отличаются от 3 или отличаются от 5. Из этой подгруппы вы выбираете отличный m_id, чтобы получить результат «3». Distinct удаляет дубликаты в предыдущем результате, которые будут дублировать в «Select».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...