पंजीकरण के अन्य ग्राहकों के पंजीकरण की पहचान करके शुरू करें। यहाँ एक दृश्य है:
create view groups as
select a.Client_id
, c.Registration_id
from AssociatedClient as a
join AssociatedClient as b on a.Registration_id = b.Registration_id
join AssociatedClient as c on b.Client_id = c.Client_id;
यह हमें देता है:
select Client_id
, min(Registration_id) as first
, max(Registration_id) as last
, count(distinct Registration_id) as regs
, count(*) as pals
from groups
group by Client_id;
Client_id first last regs pals
---------- ---------- ---------- ---------- ----------
2 2 8 4 5
3 2 8 4 18
4 5 5 1 1
5 2 8 4 5
7 10 10 1 1
8 9 9 1 1
आपको निश्चित रूप से एक दृश्य की आवश्यकता नहीं है; यह सिर्फ सुविधा के लिए है। आप बस वर्चुअल टेबल का उपयोग कर सकते हैं। लेकिन अपने आप को यह समझाने के लिए सावधानीपूर्वक निरीक्षण करें कि यह प्रत्येक ग्राहक के लिए "पाल पंजीकरण" की सही श्रेणी तैयार करता है। ध्यान दें कि दृश्य नहीं है संदर्भ Registration
. यह महत्वपूर्ण है क्योंकि Registration
से हटाने के लिए हमारे द्वारा उपयोग किए जाने के बाद भी यह वही परिणाम देता है , इसलिए हम इसे दूसरे डिलीट स्टेटमेंट के लिए उपयोग कर सकते हैं।
अब हमारे पास ग्राहकों और उनके "पाल पंजीकरण" की एक सूची है। प्रत्येक दोस्त के अंतिम पंजीकरण की तिथि क्या है?
select g.Client_id, max(Registration_date) as last_reg
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id;
g.Client_id last_reg
----------- ----------
2 2011-10-14
3 2011-10-14
4 2011-10-07
5 2011-10-14
7 2011-10-17
8 2011-10-14
निश्चित समय से पहले किसकी नवीनतम तिथि है?
select g.Client_id, max(Registration_date) as last_reg
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id
having max(Registration_date) < '2011-10-08';
g.Client_id last_reg
----------- ----------
4 2011-10-07
IIUC जिसका अर्थ होगा कि क्लाइंट #4 को हटा दिया जाना चाहिए, और उसके लिए पंजीकृत किसी भी चीज़ को हटा दिया जाना चाहिए। पंजीकरण होंगे
select * from Registration
where Id in (
select Registration_id from groups as g
where Client_id in (
select g.Client_id
from groups as g join Registration as r
on g.Registration_id = r.Id
group by g.Client_id
having max(Registration_date) < '2011-10-08'
)
);
Id Registration_date
---------- -----------------
5 2011-10-07
और, निश्चित रूप से, ग्राहक #4 पंजीकरण #5 में है, और इस परीक्षण द्वारा हटाए जाने वाला एकमात्र ग्राहक है।
वहां से आप delete
. का काम कर सकते हैं बयान। मुझे लगता है कि नियम "ग्राहक और उसके द्वारा पंजीकृत किसी भी चीज़ को हटाएं" है। यदि ऐसा है, तो मैं शायद एक अस्थायी तालिका में पंजीकरण आईडी लिखूंगा, और दोनों Registration
के लिए डिलीट लिखूंगा और AssociatedClient
इसमें शामिल होने से।