Как объединить предложение WHERE в запросе SQL - PullRequest
0 голосов
/ 20 августа 2010

Как мне сделать этот запрос лучше?

SELECT ClientID, BatchID, jobid, subjobid, count(clientid) as Total 
FROM data with(nolock) 
WHERE batchid in (select BatchID from data with(nolock) where lookupcode = '111111111111') 
and clientid in (select ClientID from data with(nolock) where lookupcode = '111111111111') 
and jobid in (select jobid from data with(nolock) where lookupcode = '111111111111') 
and subjobid in (select subjobid from data with(nolock) where lookupcode = '111111111111') 
and entrytype <> 'C'
and entrytype <> 'M'
group by clientid,BatchID, jobid, subjobid

Ответы [ 3 ]

2 голосов
/ 20 августа 2010
select ClientID, BatchID, jobid, subjobid, count(clientid) as Total 
from data with (nolock) 
where lookupcode = '111111111111'
    and entrytype not in ('C', 'M')
group by clientid, BatchID, jobid, subjobid

Обновление:

select d2.ClientID, d2.BatchID, d2.jobid, d2.subjobid, count(*) as Total  
from data with (nolock)  d1
inner join data d2 on d1.batchjobid = d2.batchjobid 
    and d1.subjobid = d2.subjobid
where d1.lookupcode = '111111111111' 
    and d2.entrytype not in ('C', 'M') 
group by clientid, BatchID, jobid, subjobid 
0 голосов
/ 20 августа 2010

Пожалуйста, попробуйте это.

SELECT d1.clientid, d1.BatchID, d1.jobid, d1.subjobid, count(clientid) as Total 
FROM data with(nolock) as d1
join (
    select BatchID, ClientID, jobid, subjobid 
    from data with(nolock) 
    where lookupcode = '111111111111'
) as d2
WHERE d1.batchid = d2.BatchID 
and d1.clientid = d2.clientid
and d1.jobid = d2.jobid
and d1.subjobid d2.subjobid
and d1.entrytype <> 'C'
and d1.entrytype <> 'M'
group by d1.clientid, d1.BatchID, d1.jobid, d1.subjobid
0 голосов
/ 20 августа 2010

Попробуйте CTE:

WITH lookup AS (
    select ClientID, BatchID, JobID, SubJobID 
    from data with(nolock) 
    where lookupcode = '111111111111'
)
SELECT ClientID, BatchID, jobid, subjobid, count(clientid) as Total 
FROM data with(nolock) 
WHERE batchid in (select BatchID from lookup) 
and clientid in (select ClientID from lookup) 
and jobid in (select jobid from lookup) 
and subjobid in (select subjobid from lookup) 
and entrytype not in ('C', 'M')
group by clientid,BatchID, jobid, subjobid

Однако ваше оригинальное решение не реализует условие, которое вы указали в комментариях:

найти все строки, имеющие одну и ту же партию работа и подработка

, поскольку вы не проверяете комбинацию задания и подзадачи.

Если вам нужно объединить некоторые поля для точных совпадений, попробуйте условие, подобное этому

WHERE EXISTS(
    SELECT 1 
    FROM lookup 
    WHERE lookup.jobid = data.jobid AND lookup.subjobid = data.subjobid
)

Поскольку у нас нет структуры таблиц и примеров данных, нам сложно проверить правильность наших решений.

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