ورود

View Full Version : مشکل Oracle در استفاده همزمان از Order By و RowNum



hamed_abutorabi
پنج شنبه 02 آذر 1391, 11:48 صبح
سلام به همه دوستان
من یه کوئری اوراکل دارم که برای فهم بهتر سوال تا حدود زیادی ساده و بعضی جا هاش کامنت شده که البته همچنان مشکل رو داره:


SELECT A.Id,A.Attachment,A.CreateDateTime,A.No ,rownum as RowNumber
FROM (
SELECT A.Id,A.Attachment,A.CreateDateTime,A.No FROM GOutgoingLetter A ,
(
SELECT B.Id, B.createdatetime as of0 FROM GOutgoingLetter B
WHERE
Exists
(Select BC.id
From XCase BC, GOutgoingLetterCase BG
Where
-- BG.CaseMechanizeState=1 And
B.id=BG.GOutgoingLetterId
-- And BG.RelatedCaseID=BC.Id
-- And BC.LASTEMPEXPERTMANID='EF38398F7291491898AF63AC024 9DDBF'
)
-- OR A.RegistrarUserId = '392182A64BD5499685FFAA2E570344D9'
)B
WHERE A.Id = B.Id
ORDER BY B.of0
)A


تو این کوئری ستون های No و Attachment در خروجی نهایی با وجود داشتن مقدار در بانک، خالی هستند.
این در حالیه که اگر دستور Order By را حذف کنیم یا اینکه از Select اصلی ستون RowNum رو حذف کنیم، مقدار همه ی ستون ها نشون داده می شه، در و=اقع مشکل تنها برای زمانیه که هر دو مورد Order By و RowNum با هم اسنفاده بشن.

لطفا راهنمایی کنید، باتشکر

oracledba
پنج شنبه 02 آذر 1391, 14:14 عصر
سلام

عبارت order by که شما نوشتین باید در انتهای دستور قرار بگیره. چون بیرونی ترین select خروجی شماست، پس باید اونو order by کنید. به عبارتی، تو selectهای تودرتو، استفاده از order by فقط تو بیرونی ترین select مجاز هستش.

رسول_57
پنج شنبه 02 آذر 1391, 14:29 عصر
با سلام

1-دقیقا سوالتان مشخص نیست : وقتی order by می گذارید مشکل ایجاد می شود یا وقتی rownum یا هر دو با هم استفاده شوند مشکل پیش می آید ؟
2-در هر دو حالت می توانید خروجی کوری را در اینجا بگذارید ؟
3-اگر بتوانید یک تست کیس به ما ارائه کنید یهتر می توانیم کمک کنیم

hamed_abutorabi
پنج شنبه 02 آذر 1391, 16:09 عصر
[QUOTE=oracledba;1632666]سلام

مشکل تنها زمانی پیش می آید که هر دوی Order By و RowNum با هم بیایند. خروجی: ( ستون های Attachment و No با وجود داشتن مقدار در بانک، در خروجی کوئری مقدار ندارند!)

95427

مثلا اگر Order By را از کوئری حذف کنیم خروجی زیر را خواهیم داشت:

95436
http://barnamenevis.org/images/misc/pencil.png

رسول_57
پنج شنبه 02 آذر 1391, 17:31 عصر
به نظر من به علت اینکه شما rownum را در کوری خارجی دارید ، کوری ای که order by دارد مقادیر متفاوتی در آن ستون دارد در حالیکه این rownum را ندارد . دقیق تر بگویم آنها مجموعه مشابهی از رکوردها هستند که در ردیف های مختلف قرار گرفته اند .

hamed_abutorabi
پنج شنبه 02 آذر 1391, 18:10 عصر
با تشکر از راهنمایی شما،

تستی که با توجه به راهنمایی شما انجام دادم این است که در SubQuery ای که عمل Order By انجام دادم، ستون RowNum نیز به خروجی اضافه شد: نتیجه این که خروجی کاملا صحیح است!

اما دلیل واقعی را درست متوجه نشدم، لطفا در صورت امکان بیشتر توضیح دهید

با تشکر مجدد

رسول_57
پنج شنبه 02 آذر 1391, 19:08 عصر
با تشکر از راهنمایی شما،

تستی که با توجه به راهنمایی شما انجام دادم این است که در SubQuery ای که عمل Order By انجام دادم، ستون RowNum نیز به خروجی اضافه شد: نتیجه این که خروجی کاملا صحیح است!

اما دلیل واقعی را درست متوجه نشدم، لطفا در صورت امکان بیشتر توضیح دهید

با تشکر مجدد

کوری جدیدتان را بنویسید تا برایتان توضیح دهم .

hamed_abutorabi
جمعه 03 آذر 1391, 12:19 عصر
SELECT A.Id,A.Attachment,A.CreateDateTime,A.No ,rownum as RowNumber
FROM (
SELECT A.Id,A.Attachment,A.CreateDateTime,A.No FROM GOutgoingLetter A ,
(
SELECT B.Id, B.createdatetime as of0 ,RowNum FROM GOutgoingLetter B
WHERE
Exists
(Select BC.id
From XCase BC, GOutgoingLetterCase BG
Where
-- BG.CaseMechanizeState=1 And
B.id=BG.GOutgoingLetterId
-- And BG.RelatedCaseID=BC.Id
-- And BC.LASTEMPEXPERTMANID='EF38398F7291491898AF63AC024 9DDBF'
)
-- OR A.RegistrarUserId = '392182A64BD5499685FFAA2E570344D9'
)B
WHERE A.Id = B.Id
ORDER BY B.of0
)A





تغییر ایجاد شده تنها در SunbQuery مربوط به کوئری ای است که Order By دارد، که تنها فیلد rownum را به خروجی select آن اضافه کرده ام

رسول_57
شنبه 04 آذر 1391, 12:41 عصر
متاسفانه تا دیتای شما را نداشته باشم نمی توانم دقیق بگویم .