2010-08-12 13 views
25

मैं 3 टेबल है (सरलीकृत):एसक्यूएल सर्वर अद्यतन शामिल हों

tblOrder(OrderId INT) 
    tblVariety(VarietyId INT,Stock INT) 
    tblOrderItem(OrderId,VarietyId,Quantity INT) 

अगर मैं कोई आदेश देने पर मैं स्टॉक स्तर इस का उपयोग कर ड्रॉप:

UPDATE tblVariety 
SET tblVariety.Stock = tblVariety.Stock - tblOrderItem.Quantity 
FROM tblVariety 
INNER JOIN tblOrderItem ON tblVariety.VarietyId = tblOrderItem.VarietyId 
INNER JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId 
WHERE tblOrder.OrderId = 1 

सभी ठीक है, जब तक वहाँ एक ही ऑर्डर आईडी के लिए एक ही VarietyId के साथ tblOrderItem में दो पंक्तियां हैं। इस मामले में, स्टॉक अपडेट के लिए पंक्तियों में से केवल एक का उपयोग किया जाता है। ऐसा लगता है कि किसी भी तरह से VarietyId द्वारा ग्रुप कर रहा है।

क्या कोई भी कुछ प्रकाश डाल सकता है? बहुत धन्यवाद।

+0

यह एक ही किस्म/आदेश संयोजन को शामिल करना असंभव हो सकता है? यही है, यदि एक ही विविधता एक आदेश के लिए> 1 दिखाई देती है, तो यह मात्रा पंक्ति में कब्जा कर लिया गया है, एकाधिक पंक्तियों में नहीं? – gbn

+0

तकनीकी रूप से, हाँ। लेकिन tblOrderItem में अन्य कॉलम हैं जिसका अर्थ है कि एक से अधिक पंक्तियां उन मूलभूत संख्याओं के साथ जा सकती हैं (उदाहरण के लिए दिनांक फ़ील्ड) – Geoff

उत्तर

43

मेरा अनुमान है कि आपने हमें सरलीकृत स्कीमा दिखाया है, कुछ जानकारी गायब है जो निर्धारित करेगी कि दिए गए ऑर्डर आईडी के लिए बार-बार वेरिटीआईडी ​​मान क्यों हैं।

जब आपके पास एकाधिक पंक्तियां होती हैं, तो SQL सर्वर क्रमशः अद्यतन के लिए उनमें से एक को चुन लेगा।

यदि यह मामला है, तो आप समूह पहले

UPDATE V 
SET 
    Stock = Stock - foo.SumQuantity 
FROM 
    tblVariety V 
    JOIN 
    (SELECT SUM(Quantity) AS SumQuantity, VarietyID 
    FROM tblOrderItem 
     JOIN tblOrder ON tblOrderItem.OrderId = tblOrder.OrderId 
    WHERE tblOrder.OrderId = 1 
    GROUP BY VarietyID 
    ) foo ON V.VarietyId = foo.VarietyId 

करने की जरूरत है यदि नहीं, तो OrderItems तालिका पी क्योंकि अगर नकल OrderID/VarietyID संयोजन की अनुमति देता है (पी होना चाहिए OrderID/VarietyID गलत है, या इन अद्वितीय)

+0

बहुत धन्यवाद जीबीएन - यह मेरे लिए किया गया ... – Geoff

+0

+1 इसे सभी के लिए काम करने के लिए मार्ग। – Tobiasopdenbrouw

+1

+100 @ जीबीएन मैं आपको एक बियर देना चाहता हूं। –

1

आप एक अद्यतन कर रहे हैं। यह एक बार अपडेट होगा।

संपादित करें: हल करने के लिए, आप एक सबक्वायरी में जोड़ सकते हैं जो राशि पर योग के साथ ऑर्डरिड और विविधता द्वारा आपके ऑर्डरिटम्स को समूहित करेगा।

12

ही सीमित होना चाहिए प्रलेखन UPDATE

एक अद्यतन बयान के परिणामोंहैं सेअपरिभाषित अगर बयान (दूसरे शब्दों में अगर अद्यतन बयान निर्धारित करने योग्य नहीं है) एक कि इस तरह से है कि केवल एक ही मूल्य प्रत्येक स्तंभ घटना कि अद्यतन किया जाता है के लिए उपलब्ध है में निर्दिष्ट नहीं है FROM खंड भी शामिल है। उदाहरण के लिए, निम्नलिखित लिपि में अद्यतन बयान दिया, टेबल में दोनों पंक्तियों अद्यतन बयान में FROM खंड की योग्यताओं को पूरा है, लेकिन यह अपरिभाषित जो रों से पंक्ति अद्यतन पंक्ति के लिए किया जाता है टेबल टी में।

CREATE TABLE s (ColA INT, ColB DECIMAL(10,3)) 
GO 
CREATE TABLE t (ColA INT PRIMARY KEY, ColB DECIMAL(10,3)) 
GO 
INSERT INTO s VALUES(1, 10.0) 
INSERT INTO s VALUES(1, 20.0) 
INSERT INTO t VALUES(1, 0.0) 
GO 
UPDATE t 
SET t.ColB = t.ColB + s.ColB 
FROM t INNER JOIN s ON (t.ColA = s.ColA) 
GO 
संबंधित मुद्दे