ورود

View Full Version : نمایش ندادن سطر تکراری



mortezahbh
شنبه 17 آبان 1393, 19:46 عصر
سلام

یک سوال داشتم؟

من در جدول بدهی هام یک جستجو انجام دادم که اون سطرهایی که بدهی خود را پرداخت نکرده اند نمایش بده

حالا یکی از فیلد های این جدول student_id است ، و از اونجایی که هر دانشجو امکان داره چند بدهی داشته باشه، میخوام فقط لیست آی دی هر دانشجویی که بدهی خود رو پرداخت نکرده رو یک بار و بدون تکرار نمایش بده

لطفا در این خصوص راهنمایی کنید

با تشکر http://www.forum.98ia.com/images/smilies/-118-.gif

حمیدرضاصادقیان
شنبه 17 آبان 1393, 20:30 عصر
سلام
با استفاده از Distinct میتونید رکوردهای تکراری رو حذف کنید.البته این فیلد برروی ترکیب چند فیلد اینکارو میکنه.مثلا اگر در Select شما چند فیلد دارید ترکیب اون ردیف رو نگاه میکنه که تکراری نباشه نه به یک فیلد خاص.
در غیر اینصورت میشه از روشهای دیگه مثل Subquery استفاده کرد که آخرین رکورد رو به شما برگردونه.
برای توضیحات دقیقتر نمونه داده ها و Query که نوشتید رو بذارید تا بشه درموردش نظر داد.

mortezahbh
شنبه 17 آبان 1393, 21:06 عصر
سلام
با استفاده از Distinct میتونید رکوردهای تکراری رو حذف کنید.البته این فیلد برروی ترکیب چند فیلد اینکارو میکنه.مثلا اگر در Select شما چند فیلد دارید ترکیب اون ردیف رو نگاه میکنه که تکراری نباشه نه به یک فیلد خاص.
در غیر اینصورت میشه از روشهای دیگه مثل Subquery استفاده کرد که آخرین رکورد رو به شما برگردونه.
برای توضیحات دقیقتر نمونه داده ها و Query که نوشتید رو بذارید تا بشه درموردش نظر داد.

ببینید من میخوام دانشجویانی که بدهکار هستند رو مشخص کنم

حالا با استفاده از کد زیر در جدول بدهی ها اون سطر هایی که بدهی اونها پرداخت نشده رو انتخاب میکنم



DM.Q_Debts.Close;
DM.Q_Debts.SQL.Clear;
DM.Q_Debts.SQL.Add('select student_id from Debts');
DM.Q_Debts.SQL.Add('where status = "پرداخت نشده"');
if (DM.IsShamsi(dp_StartDate.Text))and(DM.isshamsi(dp _EndDate.Text)) then
DM.Q_Debts.SQL.Add('and debt_date >="'+dp_StartDate.Text+'" and debt_date<="'+dp_EndDate.Text+'"');
DM.Q_Debts.SQL.Add('Group By student_id');
DM.Q_Debts.Open;


و حالا با استفاده از فیلد
student_id جدول بدهی میخوام آی دی دانشجویان بدهکار رو پیدا کنم

اما چون هر دانشجو میتونه چندین بدهی داشته باشه در جواب کوئری بالا بعنوان مثال 4 سطر بدهی از یک دانشجو مشخص میشود و من فقط نیاز دارم که درصورت وجود یک بدهی آی دی دانشجو نمایش داده شود

برای این منظور چکار باید بکنم؟

با تشکر

حمیدرضاصادقیان
شنبه 17 آبان 1393, 21:31 عصر
کافیه دستور select رو به این شکل بنویسید

select distinct student_id from ...

mortezahbh
شنبه 17 آبان 1393, 21:57 عصر
کافیه دستور select رو به این شکل بنویسید

select distinct student_id from ...

بله درست میفرمایید

اما اگه بخوام به تمامی فیلد های جدولم دسترسی داشته باشم باز هم این دستور کار میکنه؟؟؟

یعنی :



select * from Debts

حمیدرضاصادقیان
شنبه 17 آبان 1393, 22:19 عصر
خیر.باتوجه به توضیحی که در پست قبل دادم دیگه اینجا ترکیبی از کل فیلدهارو به صورت یونیک برمیگردونه.
SELECT student_id , field2
FROM
table1 AS fs1
WHERE
EXISTS(
SELECT
student_id,
field2
FROM
table1 AS fs2
WHERE
fs1.student_id=fs2.student_id
AND
fs1.field2=(SELECT MAX(field2)
FROM table1 AS fs3
WHERE fs2.student_id=fs3.student_id))
این یک ایده است .
مثلا در این مثال، Feild2 من یک فیلدی عددی هست که اضافه می شود و من میخواهم اخرین ردیف مربوط به اون student_id رو بگیرم.
اگر مثلا یک همچین فیلد مشابهی ندارید یک چیزی نیست که بشه یک همچین سناریویی رو پیاده سازی کرد میشه Query اول رو داخل یک cte نوشت و با استفاده از توابع rank یا row_number این سناریو رو شبیه سازی کرد.