Запрос SQL Not IN занимает много времени с аналогичной таблицей
У меня есть 2 таблицы, предположим, table_1 & table_2 table_1 имеет 56 столбцов и 1,2 миллиона записей, мой запрос похож
таблица_1 нравится
RollNumber | Subject | G | Part | Status
------------------------------------------------
1 | 1 | 1 | 1 | 1
1 | 1 | 1 | 2 | 1
1 | 2 | 1 | 1 | 1
1 | 2 | 1 | 2 | 5
1 | 3 | 1 | 1 | 0
1 | 3 | 1 | 2 | 1
2 | 1 | 2 | 1 | 1
2 | 1 | 2 | 2 | 1
2 | 2 | 2 | 1 | 1
2 | 2 | 2 | 2 | 1
2 | 3 | 2 | 1 | 1
2 | 3 | 2 | 2 | 1
3 | 1 | 2 | 1 | 1
3 | 1 | 2 | 2 | 1
3 | 2 | 2 | 1 | 1
3 | 2 | 2 | 2 | 1
3 | 3 | 2 | 1 | 0
3 | 3 | 2 | 2 | 1
я хочу, чтобы все RollNumber (сгруппированы по 2-му и третьему столбцу) из таблицы_1, где любой статус равен 0, но не хочу, чтобы студенты также имели статус = 5(или отличный от 1)
я пробовал это
select * from table_1 as t1
inner join table_2 as t2
on t1.column2 = t2.column2 and t1.column3 = t2.column3 and t1.column4 = t2.column4
where t1.column1 not in
(select column1 from table_1 where status = 5)
Это самый внутренний запрос моего qhole
я также пытался исключить оговорку
Оба запроса выполняются слишком долго
3 ответа
Начиная с SQL Server 2008 вы можете использовать count() over()
подсчитать, сколько всего строк в данной группе имеют определенное значение.
В этом случае вы хотите посчитать количество status <> 1
на группу и выбирать только те строки, которые принадлежат группе с количеством 0
,
select * from (
select * ,
count(case when status <> 1 then 1 end) over(partition by RollNumber, G) c
from table_1
) t where c = 0
Ты можешь использовать EXISTS
на месте NOT IN.
Это будет быстрее, так как будет boolean
сравнение вместо string
сравнение.
select * from table_1 as t1
inner join table_2 as t2
on t1.column1 = t2.column1 and t1.column2 = t2.column2 and t1.column3 = t2.column3
where not EXISTS
(select 1 from table_1 where status = 5 and t1.column3 = table_1.column3)
Попробуй использовать NOT EXISTS
вместо NOT IN
SELECT *
FROM table_1 AS t1
INNER JOIN table_2 AS t2
ON t1.column1 = t2.column1 AND t1.column2 = t2.column2 AND t1.column3 = t2.column3
WHERE NOT EXISTS(
SELECT 1
FROM table_1
WHERE status=5 AND column3=t1.column3
)