Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

TSQL समान रूप से परिणामसेट को समूहों में विभाजित करता है और उन्हें अपडेट करता है

मुझे यकीन नहीं था कि आप वास्तव में एक अद्यतन क्वेरी या एक चुनिंदा क्वेरी चाहते हैं। निम्नलिखित क्वेरी आपकी शर्तों के अधीन प्रत्येक आदेश के लिए एक नया ऑपरेटर लौटाती है:

/*
with orders as (select 1 as orderId, 'order1' as orderDesc, 1 as OperatorId),
     operators as (select 1 as operatorID, 'John' as name)
 */
select o.*, op.name as NewOperator, op.operatorID as NewOperatorId
from (select o.*, (ROW_NUMBER() over (order by newid()) % numoperators) + 1 as randseqnum
      from Orders o cross join
     (select COUNT(*) as numoperators from operators) op
     ) o join
     (select op.*, ROW_NUMBER() over (order by newid()) as seqnum
      from Operators op
     ) op
     on o.randseqnum = op.seqnum order by orderid 

यह मूल रूप से शामिल होने के लिए पंक्तियों में एक नई आईडी असाइन करता है। क्रम तालिका को यादृच्छिक रूप से असाइन किए गए 1 और ऑपरेटरों की संख्या के बीच एक मान मिलता है। इसके बाद इसे ऑपरेटरों पर एक क्रम संख्या से जोड़ा जाता है।

अगर आपको अपडेट करने की जरूरत है, तो आप कुछ ऐसा कर सकते हैं:

with toupdate as (<above query>)
update orders
    set operatorid = newoperatorid
    from toupdate
    where toupdate.orderid = orders.orderid

आपके दो प्रश्न:

क्या पहले सभी ऑर्डर और सभी ऑपरेटरों को चुनना बेहतर होगा जो अस्थायी तालिका में शर्तों को पूरा करते हैं और फिर फेरबदल करते हैं या यह सब एक बड़ी क्वेरी में करते हैं?

अस्थायी तालिकाओं का उपयोगकर्ता अनुप्रयोग के लिए प्रदर्शन और आवश्यकताओं का मामला है। यदि डेटा तेजी से अद्यतन किया जा रहा है, तो हाँ, अस्थायी तालिका का उपयोग करना एक बड़ी जीत है। यदि आप एक ही डेटा पर कई बार कई बार रैंडमाइजेशन चला रहे हैं, तो यह एक जीत हो सकती है, खासकर अगर टेबल मेमोरी में फिट होने के लिए बहुत बड़ी हैं। अन्यथा, एक बार चलने पर एक बड़ा प्रदर्शन लाभ होने की संभावना नहीं है, यह मानते हुए कि आप शर्तों को अंतरतम उपश्रेणियों के भीतर रखते हैं। हालांकि, अगर प्रदर्शन एक समस्या है, तो आप दो तरीकों का परीक्षण कर सकते हैं।

मैं अपनी प्रक्रिया के पैरामीटर के रूप में सरणी या समूहों को पास करना चाहता हूं। संग्रहित प्रक्रिया (एसक्यूएल सर्वर 2005) में सरणी पास करने के लिए कौन सा विकल्प सबसे अच्छा होगा।

हम्म, 2008 पर स्विच करें जिसमें टेबल वैल्यू पैरामीटर हैं। एरलैंड सोमरस्कोग द्वारा इस विषय पर एक अत्यधिक संदर्भ लेख यहां दिया गया है:http:// www.sommarskog.se/arrays-in-sql-2005.html



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप किसी भी मूल्य के लिए एक इंट कॉलम से कैसे पूछते हैं?

  2. SQL सर्वर सामान्य तालिका अभिव्यक्ति से परिणामों का पुन:उपयोग करें

  3. SQL सर्वर, nvarchar (MAX) या ntext, छवि या varbinary?

  4. डेटाबेस में सभी उपयोगकर्ताओं के लिए सभी अनुमतियां/पहुंच खोजने के लिए SQL सर्वर क्वेरी

  5. एसक्यूएल सर्वर में डेटाटाइप दिनांक बदलना संभव है