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

मैं तालिका की सभी पंक्तियों के माध्यम से कैसे लूप कर सकता हूं? (माई एसक्यूएल)

चूंकि लूप का सुझाव प्रक्रिया प्रकार समाधान के अनुरोध का तात्पर्य है। यहाँ मेरा है।

कोई भी क्वेरी जो किसी तालिका से लिए गए किसी एकल रिकॉर्ड पर काम करती है, उसे तालिका की प्रत्येक पंक्ति के माध्यम से चलाने के लिए एक प्रक्रिया में लपेटा जा सकता है:

पहले समान नाम वाली किसी भी मौजूदा प्रक्रिया को हटा दें, और सीमांकक को बदल दें ताकि जब आप प्रक्रिया लिखने का प्रयास कर रहे हों तो आपका SQL प्रत्येक पंक्ति को चलाने का प्रयास न करे।

DROP PROCEDURE IF EXISTS ROWPERROW;
DELIMITER ;;

फिर यहां आपके उदाहरण के अनुसार प्रक्रिया है (तालिका_ए और तालिका_बी स्पष्टता के लिए उपयोग की जाती है)

CREATE PROCEDURE ROWPERROW()
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
SELECT COUNT(*) FROM table_A INTO n;
SET i=0;
WHILE i<n DO 
  INSERT INTO table_B(ID, VAL) SELECT (ID, VAL) FROM table_A LIMIT i,1;
  SET i = i + 1;
END WHILE;
End;
;;

फिर सीमांकक को रीसेट करना न भूलें

DELIMITER ;

और नई प्रक्रिया चलाएँ

CALL ROWPERROW();

आप जो चाहें "INSERT INTO" लाइन पर कर सकते हैं जिसे मैंने आपके उदाहरण अनुरोध से कॉपी किया है।

ध्यान दें कि यहां इस्तेमाल की गई "INSERT INTO" लाइन प्रश्न में लाइन को दर्शाती है। इस उत्तर की टिप्पणियों के अनुसार आपको यह सुनिश्चित करने की आवश्यकता है कि आपकी क्वेरी वाक्य-रचना की दृष्टि से सही है कि आप SQL के किसी भी संस्करण के लिए चल रहे हैं।

साधारण मामले में जहां आपका आईडी फ़ील्ड बढ़ा हुआ है और 1 से शुरू होता है, उदाहरण में पंक्ति बन सकती है:

INSERT INTO table_B(ID, VAL) VALUES(ID, VAL) FROM table_A WHERE ID=i;

"SELECT COUNT" लाइन को

. से बदलना
SET n=10;

आपको केवल तालिका_ए में पहले 10 रिकॉर्ड पर अपनी क्वेरी का परीक्षण करने देगा।

एक अंतिम बात। यह प्रक्रिया अलग-अलग तालिकाओं में घोंसला बनाना भी बहुत आसान है और एक ही तरीका था जिससे मैं एक तालिका पर एक प्रक्रिया को अंजाम दे सकता था जो गतिशील रूप से एक मूल तालिका की प्रत्येक पंक्ति से एक नई तालिका में विभिन्न संख्या में रिकॉर्ड सम्मिलित करता था।

यदि आपको इसे तेजी से चलाने की आवश्यकता है तो इसे सेट आधारित बनाने का प्रयास करें, यदि नहीं तो यह ठीक है। आप उपरोक्त को कर्सर रूप में भी लिख सकते हैं लेकिन यह प्रदर्शन में सुधार नहीं कर सकता है। उदाहरण:

DROP PROCEDURE IF EXISTS cursor_ROWPERROW;
DELIMITER ;;

CREATE PROCEDURE cursor_ROWPERROW()
BEGIN
  DECLARE cursor_ID INT;
  DECLARE cursor_VAL VARCHAR;
  DECLARE done INT DEFAULT FALSE;
  DECLARE cursor_i CURSOR FOR SELECT ID,VAL FROM table_A;
  DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
  OPEN cursor_i;
  read_loop: LOOP
    FETCH cursor_i INTO cursor_ID, cursor_VAL;
    IF done THEN
      LEAVE read_loop;
    END IF;
    INSERT INTO table_B(ID, VAL) VALUES(cursor_ID, cursor_VAL);
  END LOOP;
  CLOSE cursor_i;
END;
;;

उन चरों को घोषित करना याद रखें जिनका आप उसी प्रकार के रूप में उपयोग करेंगे जैसे कि क्वेरी की गई तालिकाओं से।

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. UTF8 के साथ MySQL कमांड लाइन फ़ॉर्मेटिंग

  2. MySQL/MariaDB तालिकाओं का अनुकूलन कैसे करें

  3. पीडीओ ::परम टाइप दशमलव के लिए?

  4. क्लस्टर कंट्रोल के साथ गैलेरा क्लस्टर पर रिलीज टेस्ट को तेज करने के लिए ऑटोमेशन का उपयोग करना

  5. MySQL में एकाधिक पंक्तियों को एक कॉलम में कैसे संयोजित करें