2016-02-18 8 views
6

मेरे पास एक तालिका Items उदा।रिकॉर्ड्स को स्थायी रूप से स्थानांतरित करना और पुन: क्रमबद्ध करना

ID Name  ItemOrder 
---------------------- 
16 Albania 1 
13 Chile 2 
11 Barbados 3 
10 France 4 
... 

कौन सा मैं के रूप में

SELECT * FROM Items ORDER BY ItemOrder 

मेरे मुवक्किल आवेदन में प्रदर्शित मैं उदाहरण Albania और Barbados के लिए "चाल" के बाद (या मेरे पैरामीटर के आधार पर पहले) France या किसी अन्य रिकॉर्ड करने के लिए सक्षम होना चाहते हैं । इसलिए परिणाम (चाल After रिकॉर्ड France के लिए) है:

13 Chile 1  
10 France 2 
16 Albania 3 
11 Barbados 4 

और परिणाम Before के लिए है:

13 Chile 1   
16 Albania 2 
11 Barbados 3 
10 France 4 

मैं अद्यतन करने की जरूरत है स्थायी रूप से ItemOrder नई व्यवस्था को प्रतिबिंबित करने के। क्या ऐसा करने के लिए कोई आसान और कारगर तरीका है?

+1

: इस लाइन के साथ

WHEN Name IN ('Albania', 'Barbados') THEN x.o + ItemOrder * 0.1 

डब्ल्यू कैसे करते हैं ई पता है कि कौन सा रिकॉर्ड 'हिल' है (जहां यह वास्तव में नहीं चल रहा है, इसकी ऑर्डरिंग)? – sagi

+0

@sagi, हाँ मुझे नया ऑर्डर – zig

+0

को प्रतिबिंबित करने के लिए आइटमऑर्डर को अपडेट करने की आवश्यकता है तालिका – TheGameiswar

उत्तर

5

आप UPDATE कार्रवाई करने के लिए एक आम तालिका अभिव्यक्ति (CTE) का उपयोग कर सकते हैं। ताकि,

;WITH ToUpdate AS (
    SELECT ID, Name, ItemOrder, 
     ROW_NUMBER() OVER (ORDER BY temp_order) AS NewOrder 
    FROM (
    SELECT ID, Name, ItemOrder, 
     CASE 
      WHEN Name IN ('Albania', 'Barbados') THEN x.o + ItemOrder * 0.1 
      ELSE ItemOrder 
     END AS temp_order 
    FROM mytable 
    CROSS JOIN (SELECT ItemOrder FROM mytable WHERE Name = 'France') AS x(o)) AS t 
) 
UPDATE ToUpdate 
SET ItemOrder = NewOrder 

चाल France's आदेश संख्या हो और एक अंश 'अल्बानिया' के आदेश की जोड़ने के लिए है, 'बारबाडोस': यह आपकी क्वेरी 'के बाद' मामले के लिए दिखाई दे सकता है कैसे है :

  • 'अल्बानिया', 'बारबाडोस' 'फ्रांस'
  • 'अल्बानिया' और 'बारबाडोस' के बाद तैनात कर रहे हैं उन दोनों के बीच
  • 'फ्रांस' के बाद रिकॉर्ड का आदेश भी बनाए रखा है व्यवस्था बनाए रखने के ।

Demo here

संपादित करें:

'से पहले' मामले अगर हम इस लाइन विकल्प लागू किया जा सकता:

WHEN Name IN ('Albania', 'Barbados') THEN x.o - 1.0/ItemOrder * 0.1 
+0

'x.o' और' x (o) 'का अर्थ क्या है? – zig

+0

@zig यह सिर्फ एक उपनाम है जो 'क्रॉस जॉइन' ऑपरेशन द्वारा लौटाए गए परिणाम तक पहुंचने के लिए उपयोग किया जाता है। –

+0

यह अच्छी तरह से काम करता प्रतीत होता है। अभी भी परीक्षण (मैं अभी तक इस कोड को पूरी तरह से समझने में असफल रहा हूं) मैंने 'xo + ItemOrder * 0.1' को' xo - ItemOrder * 0.1' में बदलकर 'पहले' बनाने की कोशिश की लेकिन परिणाम उलट दिया गया है हालांकि रिकॉर्ड फ्रांस से पहले हैं लेकिन आदेश 'अल्बानिया', 'बारबाडोस' के बीच बनाए नहीं है। क्या आप कृपया मुझे दिखा सकते हैं कि 'पहले' केस कैसे बनाया जाए? – zig

1

(नोट: यह जवाब इससे पहले कि आप कि आप अद्यतन ItemOrder की जरूरत का उल्लेख अपने प्रश्न अद्यतन लिखा गया था।)

पहले, अपने प्रविष्टियों के बीच कुछ अंतरिक्ष बनाने:

SELECT ID, name, ItemOrder * 10 AS newOrder FROM Items 

अब हम "विशेष" को बीच में रखने के लिए एसक्यूएल को संशोधित करते हैं:

SELECT ID, name, ItemOrder 
     CASE WHEN name = 'Albania' 
      THEN (SELECT ItemOrder FROM Items WHERE name = 'France') * 10 + 1 
      WHEN name = 'Barbados' 
      THEN (SELECT ItemOrder FROM Items WHERE name = 'France') * 10 + 2 
      ELSE ItemOrder * 10 
     END AS newOrder 
    FROM Items 

और अब हम इसके द्वारा सॉर्ट कर सकते हैं:

SELECT ID, name, ItemOrder 
    FROM (... see previous SQL ...) AS t 
ORDER BY newOrder 
संबंधित मुद्दे