2013-02-06 15 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' 

के सेट की सूची में दिखाई न दें जब मैं इस मैं निम्नलिखित त्रुटि मिलती है चलाएँ:एक कुल एक अद्यतन बयान

An aggregate may not appear in the set list of an UPDATE statement.

कोई भी विचार?

+2

क्या आप वास्तव में उस कार्टेशियन उत्पाद को करना चाहते हैं? इसके अलावा, आप किस आरडीबीएमएस का उपयोग कर रहे हैं? – Lamak

+0

मैं mssql का उपयोग करता हूं, और मैं विभिन्न तालिकाओं से आता है जो pazartesi और कोटा के बीच substraction करना चाहता हूँ। –

+2

मुझे एहसास है कि आप दो अलग-अलग तालिकाओं का उपयोग करना चाहते हैं, लेकिन क्या आप जानते हैं कि आप उनके बीच 'जॉइन' स्थिति का उपयोग नहीं कर रहे हैं, इस प्रकार एक कार्टशियन उत्पाद के परिणामस्वरूप? – Lamak

उत्तर

27

मुझे लगता है कि (जैसा कि दूसरे ने इंगित किया है) आप वास्तव में इस अद्यतन पर एक कार्टशियन नहीं चाहते हैं इसलिए मैंने क्वेरी में "आईडी" जोड़ा है, इसलिए आपको कुछ संशोधन करना होगा लेकिन यह आपको मिल सकता है दाएं पथ पर

;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

मुझे आईडी के बजाय अस्थायी रूप से गिनती के बजाय गिनती का उपयोग करके काम करना था। हालांकि शानदार जवाब। –

+0

+1 [सीटीई] (https://docs.microsoft.com/en-us/sql/t-sql/queries/with-common-table-expression-transact-sql) इसके विपरीत एक सुरुचिपूर्ण और अच्छा प्रदर्शन समाधान है [असंख्य] (https://stackoverflow.com/questions/25937315/) अन्य तरीकों से जो 'CROSS' या इनलाइन सबक्वायरीज़ का उपयोग कर रहे हैं। – dakab

संबंधित मुद्दे