ریکارڈ یونٹ سے صرف پہلا نکالیں جہاں مخصوص کالم کی قیمت نقل کی گئی ہے۔
عام طور پر، جب صرف ایک نقلی ریکارڈ نکالتے ہیں، تو پہلی چیز جو ذہن میں آتی ہے وہ یہ ہے distinct
کہ میرے خیال میں،
distinct
آپ کو نقلی کالم اور دوسرے کالم کی وضاحت کرنے کی اجازت نہیں دیتا ہے جسے آپ ایک ہی وقت میں بازیافت کرنا چاہتے ہیں۔
اس کے علاوہ ،distinct
اس ضرورت سے میل نہیں کھاتا ہے کیونکہ اس میں نکالنے میں غیر نقلی ریکارڈ شامل ہیں۔
مجھے نہیں لگتا کہ آپ یہ سمجھ سکتے ہیں کہ آپ اکیلے عنوان کے ساتھ کیا کرنا چاہتے ہیں ، لہذا آئیے مثال کے طور پر نمونہ ریکارڈ استعمال کریں۔ میں جو کرنا چاہتا ہوں وہ مندرجہ ذیل نکالنے کا نتیجہ ہے۔
ID | کا نام |
---|---|
1 | نام 1 |
2 | نام 2 |
3 | نام 3 |
3 | نام 3@example.com |
4 | نام 4 نام 4@example.com |
4 | نام 4@example.com |
4 | نام 4@example.com |
اسے مندرجہ ذیل کے طور پر حاصل کریں:
ID | کا نام |
---|---|
3 | نام 3@example.com |
4 | نام 4@example.com |
آئی ڈی 1 اور 2 شامل نہیں ہیں کیونکہ وہ نقل نہیں ہیں. آئی ڈی 3 اور 4 نقل ہیں ، لہذا ان میں سے ایک بازیافت کیا جاتا ہے۔ تاہم، اس بار، ہمیں ڈی بی اسٹوریج آرڈر میں پہلا ریکارڈ نہیں ملے گا. اس کے علاوہ ، فرض کریں کہ آپ ترجیحی ترتیب میں نام کی پہلی لائن ان شرائط کے تحت چاہتے ہیں کہ "نام میں @ مارک ہے" اور "نام میں حروف کی ایک چھوٹی تعداد ہے"۔
مندرجہ بالا شرط مندرجہ ذیل ایس کیو ایل کے ساتھ حاصل کی جاسکتی ہے۔ تاہم، ہم ذیلی سوالات کا استعمال کر رہے ہیں اور کارکردگی کی جانچ نہیں کی ہے.
select
*
from
(select *, row_number() over(order by ID asc) as RowNum from SampleTable) tableMain
where tableMain.RowNum =
(
select
top(1) RowNum
from
(select *, row_number() over(order by ID asc) as RowNum from SampleTable) tableSub
where
tableMain.ID = tableSub.ID
and exists (
select
*
from
SampleTable
where
tableSub.ID = ID
having
count(*) >= 2
)
order by
case when charindex(N'@', Name) >= 1 then 0 else 1 end, len(Name)
)
نقلی قطاروں کی جانچ پڑتال کی جاتی having
ہے اور count
. group by
کلیدی کالم کو باہر سے چیک کیا جانا ہے، یہاں ID
کالم کو کس طرح محدود کیا گیا ہے where
.
پہلی قطار کو بازیافت کرنے کے لئے ترجیح کا ترتیب کس کے ذریعہ بیان کیا گیا ہے order by
۔ charindex
یہاں ، اور len
چیک کریں کہ آیا اس میں مخصوص کردار اور تار کی لمبائی شامل ہے۔
top
آپ کو صرف ہر نقلی ریکارڈ کی پہلی قطار حاصل کرنے کی ضرورت ہے۔
اصل میں ، یہ ٹھیک ہے ، لیکن اگر بالکل ایک ہی قدر کے ساتھ دو یا زیادہ ریکارڈ موجود ہیں ، جیسے "آئی ڈی: 4 ، نام: 4@example.com نام"، تو آپ کو لازمی طور پر دو ریکارڈ ملیں گے۔
row_number
لہذا ، اسے شامل کیا جاتا ہے تاکہ اسے ہر قطار کے ساتھ شناخت کیا جاسکے ، تاکہ بالکل اسی قدر کے ساتھ صرف ایک ریکارڈ بازیافت کیا جاسکے۔
اگر یہ معلوم ہے کہ بالکل وہی ریکارڈ موجود نہیں ہے تو ، میرے خیال میں row_number
موجودہ ریکارڈ کی قدروں کو شامل کیے بغیر چیک کرنا بہتر ہوگا۔
اگر نقل کے لئے متعدد چابیاں چیک کرنے کے لئے ہیں تو ، آپ ہر ایک کے لئے کلیدی کالموں کی تعداد میں اضافہ کرسکتے ہیں۔ مثال کے طور پر، مندرجہ ذیل ریکارڈ پر غور کریں: ڈپلیکیٹ کے لئے چیک کیے جانے والے کالم "ID1" اور "ID2" ہیں۔
ID1 | ID2 | نام |
---|---|---|
1 | 1 | نام 1 |
2 | 1 | نام 2 |
3 | 1 | نام 31 |
3 | 2 | نام 32 |
4 | 1 | نام 41 |
4 | 2 | نام 42 |
4 | 2 | نام 4@example.com |
5 | 1 | نام 555@example.com |
5 | 1 | نام 55@example.com |
5 | 2 | نام 5@example.com |
6 | 1 | نام 6 |
6 | 1 | نام 66@example.com |
6 | 2 | نام 6 |
6 | 2 | نام 6 |
حصول کا نتیجہ درج ذیل ہے۔
ID1 | ID2 | نام |
---|---|---|
4 | 2 | نام 4@example.com |
5 | 1 | نام 55@example.com |
6 | 1 | نام 66@example.com |
6 | 2 | نام 6 |
ایس کیو ایل اس طرح نظر آتا ہے: آپ آسانی سے اس حصے میں اضافہ کرسکتے ہیں جہاں کلیدی کالم کی وضاحت کی گئی تھی۔
select
*
from
(select *, row_number() over(order by ID1 asc, ID2 asc) as RowNum from SampleTable) tableMain
where tableMain.RowNum =
(
select
top(1) RowNum
from
(select *, row_number() over(order by ID1 asc, ID2 asc) as RowNum from SampleTable) tableSub
where
tableMain.ID1 = tableSub.ID1
and tableMain.ID2 = tableSub.ID2
and exists (
select
*
from
SampleTable
where
tableSub.ID1 = ID1
and tableSub.ID2 = ID2
having
count(*) >= 2
)
order by
case when charindex(N'@', Name) >= 1 then 0 else 1 end, len(Name)
)