PDA

View Full Version : اشکال در اتصال دو Query به یکدیگر



siavash270
سه شنبه 26 تیر 1386, 07:38 صبح
سلام خدمت اساتید محترم
من دو تا Query دارم و میخوام اطلاعات مربوط به Query دوم بعد از اطلاعات Query اول که در هر دو از Order by استفاده شده است قرار بگیره. وقتی از Union استفاده میکنم به خاطر وجود order by قبل از دستور union خطا میده.
Select [field1],[field2],... from [Table1] Where [Condition] order by [field1] union all Select [field1],[field2],... from [Table1] Where [Condition] order by [field2]

البته هر دو تا Query بر روی یک جدول زده میشه و البته به خاطر اینکه دستور طولانی نشه از یک inner join که در داخل هر کدوم از Query ها قرار داره صرف نظر کردم. در حقیقت نحوه مرتب سازی اطلاعات برام مهمه و با یک Query نمیتونم به اون چیزی که میخوام دست پیدا کنم بنابراین مجبورم از دو تا Query استفاده کنم و نتایج رو در یک غالب نمایش بدم.
لطفا راهنمایی کنید که این کار رو چطوری باید انجام داد؟

supporter
سه شنبه 26 تیر 1386, 23:37 عصر
یک راه حل که البته شاید بشه بهترش کرد:




Select [field1],[field2],...
From (
Select 1 AS F1, [Field1] as F2, [field1],[field2],... from [Table1] Where [Condition]
UNION ALL
Select 2 AS F, [Field2] as F2, [field1],[field2],... from [Table2] Where [Condition]
)T
Order BY F1, F2

siavash270
چهارشنبه 27 تیر 1386, 07:51 صبح
یک راه حل که البته شاید بشه بهترش کرد:




Select [field1],[field2],...
From (
Select 1 AS F1, [Field1] as F2, [field1],[field2],... from [Table1] Where [Condition]
UNION ALL
Select 2 AS F, [Field2] as F2, [field1],[field2],... from [Table2] Where [Condition]
)T
Order BY F1, F2



با تشکر از شما دوست عزیز
بهتره در مورد کاری که میخوام انجام بدم بیشتر توضیح بدم تا شاید کسی بتونه راهنمایی کنه.
من یک نرم افزار حسابداری دارم و همونطوری که دوستان میدونند در نمایش اسناد حسابداری ابتدا باید ارقام مربوط به ستون بدهکاران به ترتیب کد حساب نمایش داده بشه و بعد از اون ارقام مربوط به ستون بستانکاران به ترتیب کد حساب در واقع باید اول رکوردهایی که فیلد بدهکارشون مقدار داره به ترتیب کد حساب مرتب بشه و بعد رکوردهایی که فیلد بستانکار اونها مقدار داره به ترتیب کد حساب مرتب بشه و در پایان پشت سر هم نمایش داده بشه.
با این دو تا Query من اطلاعات رو به درستی از توی بانک در میارم ولی نمیدونم چطوری باید بهم وصلشون کنم. چون وقتی از Union all استفاده میکنم به خاطر وجود order by در Query اول خطا میده ولی نمیشه این order by رو حذف کرد چون اگه در آخر قرار بگیره اطلاعات اول بر اساس کد حساب مرتب میشه و در اینصورت ستون بدهکار و بستانکار اونطوری که باید نمایش داده نمیشه.

select acccode,debit,credit from sanad where snd_no=[SND#] and debit<>0 order by acccode,debit
select acccode,debit,credit from sanad where snd_no=[SND#] and credit<>0 order by acccode,credit

از اساتید محترم خواهش میکنم راهنمایی کنند این مسئله خیلی برام مهمه.

AminSobati
چهارشنبه 27 تیر 1386, 13:32 عصر
روشی که Supporter نوشتن چرا جواب نمیده برای شما؟ آزمایش کردین؟

siavash270
چهارشنبه 27 تیر 1386, 14:37 عصر
Supporter عزیز
متاسفانه من دقیقا متوجه منظور شما نشدم. ممکنه لطف کنید و همین دو تا Query که در بالا نوشتم به اون فرمی که مد نظرتون هست برام بنویسید؟

najafzade
چهارشنبه 27 تیر 1386, 15:02 عصر
نکنه کوئری اول به دومی یه جوری مربوطه که نمی تونن با هم اجرا بشن؟:گیج:

siavash270
چهارشنبه 27 تیر 1386, 17:39 عصر
نکنه کوئری اول به دومی یه جوری مربوطه که نمی تونن با هم اجرا بشن؟:گیج:
هر دو تا Query بر روی یک جدول هستند ولی منظور شما رو از اینکه به هم مربوطند متوجه نمیشم. در واقع با یک Query میشه اطلاعات مربوط به یک سند رو از بانک درآورد ولی مشکل من سر مرتب سازی رکوردهای اون سند هستش برای همین دو تا Query نوشتم یکی رکوردهایی که فیلد بدهکار مقدار داره رو مرتب میکنه و دومی رکوردهایی که فیلد بستانکارشون مقدار داره مرتب میکنه.

supporter
پنج شنبه 28 تیر 1386, 21:14 عصر
SELECT acccode,debit,credit
FROM (
SELECT1 AS F1, Debit AS F2, acccode,debit,credit
FROM sanad
WHERE snd_no=[SND#] and debit<>0
UNION ALL
SELECT 2 AS F1, credit AS F2, acccode,debit,credit
FROM sanad
WHERE snd_no=[SND#] and credit<>0
) T
ORDER BY F1,acccode,F2


این هم جواب میده:




SELECT acccode,debit,credit
FROM (
SELECT 1 AS F1, acccode,debit,credit
FROM sanad
WHERE snd_no=[SND#] and debit<>0
UNION ALL
SELECT 2 AS F1, acccode,debit,credit
FROM sanad
WHERE snd_no=[SND#] and credit<>0
) T
ORDER BY F1, acccode,
CASE
WHEN F1 = 1 THEN debit
ELSE credit -- F1=2
End

supporter
پنج شنبه 28 تیر 1386, 21:30 عصر
یک راه حل بهتر (فراموش کرده بودم که هر دو تا Query روی یک جدول هستند ):




SELECT acccode,debit,credit
FROM sanad
WHERE snd_no=[SND#]
order by CASE
WHEN debit<>0 THEN 1
ELSE 2 -- credit<>0
End, acccode, debit, credit

siavash270
شنبه 30 تیر 1386, 12:12 عصر
یک راه حل بهتر (فراموش کرده بودم که هر دو تا Query روی یک جدول هستند ):




SELECT acccode,debit,credit
FROM sanad
WHERE snd_no=[SND#]
order by CASE
WHEN debit<>0 THEN 1
ELSE 2 -- credit<>0
End, acccode, debit, credit


جناب supporter عزیز
بی نهایت از لطف شما ممنونم. دلم نیومد فقط با یک کلید از شما تشکر کنم. این لطفا شما رو هیچ موقع فراموش نخواهم کرد. امیدوارم در تمامی مراحل زندگیتان موفق باشید.