2013-02-06 19 views
16
UPDATE [asgdb01].[dbo].[info] 
SET [FM] = SUM(a.[PAZARTESI] - b.[KOTA]) 
FROM [asgdb01].[dbo].[info] a, [asgdb01].[dbo].[kota] b 
WHERE a.[WORK_TYPE]='IN' AND a.[NAME]='ALP' 

kümesi listesinde görünmeyebilir?bir agrega bir UPDATE deyimi

+2

Aslında bu kartezyen ürünü yapmak ister misiniz? Ayrıca, ne RDBMS kullanıyorsunuz? – Lamak

+0

mssql kullanıyorum ve farklı masalardan gelen pazartesi ile kota arasındaki ayrımı yapmak istiyorum. –

+2

İki farklı tablo kullanmak istediğinizi biliyorum, ancak aralarında bir "JOIN" koşulu kullanmadığınızı, dolayısıyla kartezyen bir ürünle sonuçlandığınızı biliyor musunuz? – Lamak

cevap

27

Tahmin ediyorum (diğerlerinin işaret ettiği gibi) bu güncellemede gerçekten bir kartezyen istemiyorsunuz, bu yüzden sorguya bir "id" ekledim, böylece bir değişiklik yapmanız gerekecek, ancak bu size Doğru yol üzerinde

;with temp as (
    select a.id, SUM(a.pazartesi - b.kota) as newTotal 
    from [asgdb01].[dbo].[info] a join [asgdb01].[dbo].[kota] b 
      on a.id = b.id 
    where a.work_type='in' and a.name='alp') 
update a 
set  fm = t.newTotal 
from [asgdb01].[dbo].[info] a join temp t on a.id = t.id 
+0

Toplamı yerine sayı kullanarak çalışmasını sağlamak için kimliğiyle kimliğe göre gruplamak zorunda kaldım. Fantastik cevap olsa da. –

+0

+1 [CTEs] (https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql) aksine bir zarif ve iyi bir performans çözümü [çok sayıda] (https://stackoverflow.com/questions/25937315/) "CROSS" veya satır içi alt sorgular kullanan diğer yollar. – dakab