SQL Join, где два параметра должны быть в таблице - PullRequest
0 голосов
/ 14 октября 2019

Я использую MS SQL Server 2014, и у меня одна таблица выглядит следующим образом: (table1)

PropertyId
1 
2
3
4

И еще одна таблица выглядит следующим образом: (table2)

PropertyId   Filter
1            1
1            2
2            1
3            1
4            2

Я хочу получить все свойства из первой таблицы, имеющей фильтр 1 И 2 ​​(в данном случае только PropertyId 1)

Я могу сделать это, используя:

Select * from table1 where id in (select PropertyId from table2 where filter = 1) AND (select PropertyId from table2 where filter = 2)

Если я использую соединение, Я получу все свойства, которые есть в table2:

Select * from table1 join table2 on table1.PropertyId = table2.PropertyId where table2.Filter in (1,2)

Table1 получил около 200'000 строк, а table2 - около 2'500'000 строк, поэтому решение должно быть действительно эффективным :)

РЕДАКТИРОВАТЬ: Извините за неясность в моем вопросе:

  • Таблица 1 содержит 22 столбца, а таблица 2 содержит 7 столбцов
  • Запрос может иметь до 13фильтры, поэтому запрос должен обрабатывать это
  • Если это возможно, я бы предпочел не иметь больше, чем один или два выбора

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Один метод использует агрегацию. Если вам не нужно фильтровать по первой таблице, вы можете просто сделать:

select propertyId
from table2
where filter in (1, 2)
group by propertyId
having count(*) = 2;  -- "2" = number of things you are looking for

Примечание: это предполагает, что значения свойства / фильтра уникальны во второй таблице. В противном случае вы можете использовать count(distinct).

РЕДАКТИРОВАТЬ:

Если вам нужно отфильтровать по первой таблице, просто добавьте его в:

select t2.propertyId
from table1 t1 join
     table2 t2
     on t2.propertyId = t1.propertyId
where filter in (1, 2)
group by t2.propertyId
having count(*) = 2;  -- "2" = number of things you are looking for
0 голосов
/ 14 октября 2019

Посмотрите, работает ли это для вас:

select PropertyId
from table1
where PropertyId in
(
select t21.PropertyId
from table2 t21
inner join table2 t22 on t22.PropertyId = t21.PropertyId and t22.Filter = 2
where t21.Filter = 1
)
0 голосов
/ 14 октября 2019

Используйте inner Join , чтобы получить только подключенные ключи

Select * from table1 inner join table2 on table1.PropertyId = table2.PropertyId where table2.Filter in (1,2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...