मैं डेटाबेस प्रबंधन का उपयोग करके बनाए जा रहे एप्लिकेशन में लागू करने के लिए खुद को कुछ बुनियादी एसक्यूएल सिखाने की कोशिश कर रहा हूं।
कार्यान्वयन के तुरंत बाद, मुझे एहसास हुआ कि मुझे यकीन नहीं था कि डुप्लिकेट प्रविष्टियों से कैसे निपटें। ऑनलाइन देखने पर ऐसा लगता है कि मुझे डेटा के प्रत्येक टुकड़े के लिए एक 'अद्वितीय' बाधा निर्दिष्ट करने की आवश्यकता है, जिसके डुप्लिकेट होने की संभावना है, लेकिन मैं जानना चाहता था कि क्या मैं इसे अलग तरीके से देख सकता हूं।
निष्कर्ष में, मैं एक अलग विचार लेकर आया हूं जिसमें इस मुद्दे पर संपर्क करना है, मुझे यकीन नहीं है कि इसे SQL में कैसे लिखा जाए या भले ही यह एक व्यवहार्य विचार हो।
मैं चाहता हूं कि कुछ बाहरी इनपुट या तो इसे पूरा करने में मेरी सहायता करें या मेरे विचार को अस्वीकृत करें।
डार्ट भाषा का उपयोग करके मैं सभी डुप्लिकेट प्रविष्टियों की तलाश कर सकता हूं, और कितने डुप्लिकेट मौजूद हैं। इस परिणाम को प्राप्त करने के लिए मैं यही उपयोग कर रहा हूं:
SELECT `title`, COUNT(*) FROM `Article` GROUP BY `url` HAVING COUNT(*) > 1
और यह परिणाम है
flutter: [{title: US Stock Market Chalks up Huge Weekly Losses; Bitcoin, DXY Impress, COUNT(*): 2}, {title: What Triggered Ethereum to Rise 66% Within 1 Week? Factors and Trends, COUNT(*): 26}, {title: What’s Next for Crypto Miners?, COUNT(*): 2}]
क्या मैं शायद सभी डुप्लिकेट परिणामों को उसके द्वारा लौटाई गई राशि से हटा सकता/सकती हूं?
COUNT(*)
माइनस वन?इसका मतलब यह होगा कि अगर मेरे पास
What Triggered . के 26 डुप्लीकेट थे? इथेरियम 1 सप्ताह के भीतर 66% बढ़ जाएगा? कारक और रुझान
, मैं कर सकता थाCOUNT(*)
द्वारा दर्शाई गई संख्या को हटा दें, 26 होने के नाते लेकिन पहले 26 नंबर से माइनस 1 हटाना, प्रभावी रूप से मुझे एक के साथ छोड़ना डुप्लिकेट बचा है? (उपयोग करने का वांछित परिणाम होने के नाते उपरोक्त 'अद्वितीय' बाधा)
संपादित करें: यह SQL लाइन है जिसका उपयोग मैं अपने डेटाबेस में डेटा की एक नई पंक्ति इनपुट करने के लिए करता हूं।
'INSERT INTO Article(title, description, url, urltoimage, publishedat) VALUES("$title", "$description", "$url", "$urlToImage", "$publishedAt")'
1 उत्तर
आप सभी बार 1 प्रविष्टि को प्रति url आधार पर हटा सकते हैं - यह मानते हुए कि url कॉलम अद्वितीय होना चाहिए - यदि केवल url कॉलम या किसी अन्य कॉलम से अधिक का संयोजन पहले दो WHERE क्लॉज को बदल देता है। - यह धारणा भी बनाई जाती है कि तालिका बिना ROWID तालिका के नहीं है।
:-
SELECT count() FROM article WHERE url = 'myurl';
WITH cte AS (
SELECT rowid AS thisrowid
FROM article
WHERE url = 'myurl'
ORDER by url
LIMIT (SELECT count(*)-1 FROM article WHERE url = 'myurl')
)
DELETE FROM article WHERE rowid IN (SELECT thisrowid FROM cte);
यह पंक्ति निकालने के लिए एक CTE (कॉमन टेबल एक्सप्रेशन (अस्थायी तालिका)) का उपयोग करता है (एक विशेष सामान्य रूप से छिपा हुआ कॉलम जो हमेशा मौजूद रहता है जब तक कि बिना ROWID निर्दिष्ट नहीं किया जाता है) लेख की सभी बार 1 पंक्ति से तालिका चयन मानदंड के अनुसार (WHERE क्लॉज) (इस मामले में जहां url कॉलम में myurl होता है)। यानी LIMIT का उपयोग किया जाता है और यह उसी WHERE क्लॉज कम 1 के अनुसार पंक्तियों की संख्या है।
यह सीटीई, पंक्तियों की एक सूची तब DELETE के WHERE क्लॉज के आधार के रूप में उपयोग की जाती है।
कार्य उदाहरण SQL
निम्नलिखित SQL का उपयोग करके उपरोक्त का परीक्षण किया गया था: -
DROP TABLE IF EXISTS article;
CREATE TABLE IF NOT EXISTS article (title TEXT, description TEXT, url TEXT, urltoimage TEXT, publisheddat);
INSERT INTO article VALUES
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01')
;
SELECT count() FROM article WHERE url = 'myurl';
WITH cte AS (
SELECT rowid
FROM article
WHERE url = 'myurl'
ORDER by url
LIMIT (SELECT count(*)-1 FROM article WHERE url = 'myurl')
)
-- SELECT * FROM cte;
DELETE FROM article WHERE rowid IN (SELECT * FROM cte);
SELECT count() FROM article WHERE url = 'myurl';
दो प्रश्नों के परिणाम हैं: -
हटाने से पहले पंक्तियों की संख्या :-
शेष पंक्तियों की संख्या :-
वैकल्पिक सरल और फिर से होने वाली समस्या को ठीक करता है
यह कहना शायद उतना ही आसान होगा
- एक नई तालिका बनाएं उदा। article_new तालिका जिसमें UNIQUE बाधा शामिल है लेकिन अन्यथा समान और
- फिर इसे मौजूदा तालिका से पॉप्युलेट करें (डुप्लिकेट छोड़ते समय विफल न होने के लिए INSERT या IGNORE का उपयोग करके)।
- फिर मूल तालिका का नाम बदलें (इसे छोड़ सकता है लेकिन सुरक्षित नहीं है) उदा। लेख_पुराने को
- फिर नई तालिका का नाम बदलकर मूल तालिका नाम करें
- अंत में नाम बदला हुआ छोड़ दें (यदि ऐसा करने में खुशी हो)।
कोड हो सकता है (फिर से यह मानते हुए कि url कॉलम को अद्वितीय होना चाहिए): -
DROP TABLE IF EXISTS article_new;
DROP TABLE IF EXISTS article_old;
CREATE TABLE IF NOT EXISTS article_new (title TEXT, description TEXT, url TEXT UNIQUE, urltoimage TEXT, publisheddat);
INSERT OR IGNORE INTO article_new SELECT * FROM article;
ALTER TABLE article RENAME TO article_old;
ALTER TABLE article_new RENAME TO article;
DROP TABLE IF EXISTS article_old;
कार्य उदाहरण (3 अलग-अलग यूआरएल कॉलम के साथ जोड़े गए अधिक पंक्तियों पर ध्यान दें) :-
DROP TABLE IF EXISTS article;
CREATE TABLE IF NOT EXISTS article (title TEXT, description TEXT, url TEXT, urltoimage TEXT, publisheddat);
INSERT INTO article VALUES
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl','myimageurl','2018-01-01'),
('Title001','Description001','myurl2','myimageurl','2018-01-01'),
('Title001','Description001','myurl3','myimageurl','2018-01-01'),
('Title001','Description001','myurl3','myimageurl','2018-01-01'),
('Title001','Description001','myurl3','myimageurl','2018-01-01'),
('Title001','Description001','myurl3','myimageurl','2018-01-01'),
('Title001','Description001','myurl3','myimageurl','2018-01-01')
;
DROP TABLE IF EXISTS article_new;
DROP TABLE IF EXISTS article_old;
CREATE TABLE IF NOT EXISTS article_new (title TEXT, description TEXT, url TEXT UNIQUE, urltoimage TEXT, publisheddat);
INSERT OR IGNORE INTO article_new SELECT * FROM article;
ALTER TABLE article RENAME TO article_old;
ALTER TABLE article_new RENAME TO article;
DROP TABLE IF EXISTS article_old;
SELECT * FROM article;
परिणाम :-
संबंधित सवाल
नए सवाल
sql
संरचित क्वेरी भाषा (एसक्यूएल) डेटाबेस को क्वेरी करने के लिए एक भाषा है। प्रश्नों में कोड उदाहरण, तालिका संरचना, नमूना डेटा और DBMS कार्यान्वयन के लिए एक टैग (जैसे MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2, आदि) का उपयोग किया जाना चाहिए। यदि आपका प्रश्न केवल एक विशिष्ट DBMS (विशिष्ट एक्सटेंशन / सुविधाओं का उपयोग करता है) से संबंधित है, तो इसके बजाय उस DBMS के टैग का उपयोग करें। एसक्यूएल के साथ टैग किए गए सवालों के जवाब में आईएसओ / आईईसी मानक एसक्यूएल का उपयोग करना चाहिए।