FROM
SELECT
का हिस्सा कथन में वास्तविक तालिका नाम होना चाहिए, न कि CHAR(100)
वेरिएबल जिसमें तालिका का नाम होता है। यह बस इस तरह काम नहीं करता है।
ऐसा लगता है कि आप अपने डेटाबेस में समान संरचना वाली कई तालिकाओं के विरुद्ध एक विशेष क्वेरी चलाना चाहते हैं। अक्सर इसका मतलब है कि डेटाबेस स्कीमा में सुधार किया जा सकता है। लेकिन, अगर आपके पास जो कुछ भी है उससे निपटना है तो आपको डायनामिक SQL . MySQL दस्तावेज़ के इस लिंक का एक उदाहरण है "यह दर्शाता है कि तालिका के नाम को उपयोगकर्ता चर के रूप में संग्रहीत करके, रनटाइम पर क्वेरी करने के लिए तालिका का चयन कैसे करें", जो कि ठीक वही है जो आपको चाहिए।
अपने लूप के अंदर आपको SQL क्वेरी के साथ एक स्ट्रिंग बनाने और EXECUTE
. का उपयोग करने की आवश्यकता है ।
SET @s = CONCAT('select count(distinct signature) from ', tableName);
PREPARE stmt FROM @s;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
जहाँ तक मैं समझता हूँ, EXECUTE
. का परिणाम संग्रहीत प्रक्रिया के कॉलर को भेजा जाता है जैसे कि यह सामान्य था SELECT
, इसलिए इस उदाहरण में कॉलर को एकाधिक परिणाम सेट प्राप्त होंगे यदि आपके डेटाबेस में एक से अधिक तालिकाएं हैं where table_name like "%FAULT_20150320%"
।
MySQL डायनेमिक SQL MySQL स्टोर्ड प्रोसीजर में डायनामिक एसक्यूएल कैसे रखें कुछ उदाहरणों के साथ।
ऐसा लगता है कि आप ऐसा कुछ चाहते हैं। यह signatureCount
. में कई तालिकाओं से गणनाओं का योग करना चाहिए चर।
CREATE PROCEDURE CountSignatures()
BEGIN
DECLARE done INT DEFAULT FALSE;
DECLARE signatureCount INT;
DECLARE tableName CHAR(100);
DECLARE tableList CURSOR FOR SELECT table_name FROM information_schema.tables WHERE table_name LIKE "%FAULT_20150320%";
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
SET signatureCount = 0;
OPEN tableList;
tableListLoop: LOOP
SET done = FALSE;
FETCH tableList INTO tableName;
IF done THEN
LEAVE tableListLoop;
END IF;
SET @VarCount = 0;
SET @VarSQL = CONCAT('SET @VarCount = (SELECT COUNT(DISTINCT signature) FROM ', tableName, ')');
PREPARE stmt FROM @VarSQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET signatureCount = signatureCount + @VarCount;
END LOOP;
CLOSE tableList;
SELECT signatureCount;
END$$
एक अन्य प्रकार, यदि आपको संसाधित करने के लिए आवश्यक तालिकाओं की संख्या अधिक नहीं है, तो गतिशील रूप से एक बड़ा SQL कथन बनाना है जिसमें आपके लूप के अंदर सभी तालिकाएं शामिल हैं और फिर EXECUTE
यह एक बार में:
SELECT
(COUNT(DISTINCT signature) FROM Table1) +
(COUNT(DISTINCT signature) FROM Table2) +
...
(COUNT(DISTINCT signature) FROM TableN) AS TotalCount