2014-10-22 2 views
0

Может ли кто-нибудь помочь мне переписать SQL-запрос, как показано ниже? Повторяется подзапрос.Как переписать SQL-запрос, содержащий повторяющийся SubQuery?

update policy 
set totalvehicles = (
    select count(*) from riskunit 
    where riskunit.policyId = policy.id 
    and riskunit.subtype = 7) 
where policy.verified = '1' 
and policy.Totalvehicles <(
    select count(*) 
    from riskunit 
    where riskunit.policyId = policy.id 
    and riskunit.subtype = 7 
); 

Спасибо!

+0

установить переменную в значение подзапроса, а затем ссылаться, что вместо того, чтобы повторять подзапрос – steoleary

+1

Какой тип SQL-сервера вы используете? sql-server, mysql ...? – ccheneson

+0

Нужно ли быть в 1 запросе? – ccheneson

ответ

2

Это должно работать (при условии, MySQL, также работает для Oracle):

update policy p 
inner join (
    select policyId, count(*) as n from riskunit 
    where riskunit.subtype = 7 
    group by policyId 
) ru on ru.policyId = p.id 
set p.totalvehicles = ru.n 
where p.verified = '1' 
and p.Totalvehicles < ru.n; 
+0

@fancyPants .... я didnot видел ваш ответ ... ОК я удалил свой ответ. – Karunakar

+0

@fancyPants: Я проверил ваш запрос на Oracle, но systax с ошибкой на «update policy p internal join». спасибо – latala

+0

@latala В сообщении об ошибке говорится, что фактическая ошибка находится слева от 'политики обновления p ...'. Вы запускаете это в хранимой процедуре случайно? Предоставьте полное сообщение об ошибке и код, иначе мы не сможем. – fancyPants

2

Я предпочитаю это, потому что это легко вставить отборное выше от и посмотреть, что будет изменен.

UPDATE p 
SET totalvehicles = cnt.[Count] 
FROM policy p 
INNER JOIN (
    SELECT 
     policyId,COUNT(*) [Count] 
    FROM riskunit 
    WHERE ru.subtype = 7 
    GROUP BY policyId 
) cnt on cnt.policyId=p.policyId 
WHERE p.verified = '1' 
AND p.Totalvehicles < cnt.[Count] 
+0

спасибо, он работал на MySQL, но в синтаксисе Oracle для обновления отличается :) – latala