ऐसा करने का एक और उपाय यहां दिया गया है:
CREATE TABLE TEMP
(n int);
INSERT INTO Temp VALUES(0),(1),(2),(3),(4),(5),(6),(7),(8),(9);
SET @maxid = (SELECT MAX(orders_id) FROM orders);
SELECT s.id
FROM
(
SELECT id
FROM
(
SELECT t4.n * 1000 + t3.n * 100 + t2.n * 10 + t1.n + 1 AS id
FROM TEMP AS t1
CROSS JOIN TEMP AS t2
CROSS JOIN TEMP AS t3
CROSS JOIN TEMP AS t4
) t
WHERE id BETWEEN 1000 AND @maxid
) s
LEFT JOIN orders t ON s.id = t.`orders_id`
WHERE t.`orders_id` IS NULL;
इससे आपको orders_id
मिल जाना चाहिए रों:
ID
1001
1002
1005
1006
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1021
1022
1023
1024
SQL Fiddle Demo
ध्यान दें कि: मैंने एक TEMP
बनाया है 0 से 9 तक के मानों वाली तालिका, आपके द्वारा पोस्ट की गई क्वेरी में आपके द्वारा पोस्ट किए गए लूप के बजाय 1 से 10000 के मान वाली एंकर तालिका उत्पन्न करने के लिए उपयोग करने के लिए। आप अपनी तालिका के मानों के आधार पर इस तालिका के मानों को नियंत्रित कर सकते हैं। यदि आपके पास 10000 से अधिक के मान थे CROSS JOIN
TEMP
तालिका एक बार और।
अपडेट करें: अगर orders_id
डेटाटाइप का है varchar
बस इसे INTEGER
. पर डालें इस तरह:
SELECT s.id
FROM
(
SELECT id
FROM
(
SELECT t4.n * 1000 + t3.n * 100 + t2.n * 10 + t1.n + 1 AS id
FROM TEMP AS t1
CROSS JOIN TEMP AS t2
CROSS JOIN TEMP AS t3
CROSS JOIN TEMP AS t4
) t WHERE id between 1000 AND @maxid
) s
LEFT JOIN
(
SELECT CONVERT(orders_id, UNSIGNED INTEGER) AS orders_id
FROM orders
) t ON s.id = t.`orders_id`
WHERE t.`orders_id` IS NULL;