ايران ويج

نسخه‌ی کامل: مشکل با SELECT TOP هنگام بکارگیری Order By
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام Rolleyes
این کوئری توی SQL Server درست کار میکنه.
توی Access هم چند ثانیه بعد از اجرا شدن این پیغام رو میده:
At most one record can be returned by this subquery
توی Fast Report هم اگه کانکشن Access باشه از همون اول این پیغام بالایی رو میده و اصلا گزارش اجرا نمیشه ولی با کانکشن SQL مشکلی نداره.

کد:
SELECT
tblDevices.ID,
tblDevices.fldRoomID,
tblDevices.fldName,
tblDevices.fldModel,
tblDevices.fldSerialNo,
tblDevices.fldAmvalNo,
tblDevices.fldDateEnter,
tblDevices.fldDateEnterSh,
tblDevices.fldDateExit,
tblDevices.fldDateExitSh,
tblDevices.fldReason,
tblDevices.fldDescription,
(SELECT TOP 1 tblPolomps.fldPolompNo FROM tblPolomps
WHERE fldDeviceID = tblDevices.ID ORDER BY fldPolompDate)AS fldPolomp  
FROM tblDevices WHERE tblDevices.fldDateExitSh = ''

جالبه که با پاک کردن Order By مشکلش توی Access و Fast Report حل میشه ولی دیگه ارزشی برای من نداره چون من جدیدترین پلمپ رو میخوام باید بر حسب تاریخ، مرتبشون کنم!

چیکار کنم؟ Sad
تقصیر مایکروسافته؟
بابا این کارمندهای تازه استخدام رو توی پروژه های مهم بکار نگیرین!
الان خروجی این دستور چیه؟!
کد php:
SELECT TOP 1 tblPolomps.fldPolompNo FROM tblPolomps
WHERE fldDeviceID 
tblDevices.ID ORDER BY fldPolompDate 
(۱۸-اسفند-۱۳۹۲, ۰۱:۴۸:۲۸)babyy نوشته است: [ -> ]الان خروجی این دستور چیه؟!
کد php:
SELECT TOP 1 tblPolomps.fldPolompNo FROM tblPolomps
WHERE fldDeviceID 
tblDevices.ID ORDER BY fldPolompDate 

تنهایی که هیچ! ولی توی قطعه کد ارسال اول، کارش اینه که از پلمپ های موجود برای هر دستگاه
یعنی رکوردهایی که شرط tblPolomps.fldDeviceID = tblDevices.ID برقرار باشه
یه دونه رکورد رو انتخاب کنه.

اگه Order By عمل کنه که جدیدترین پلمپ انتخاب میشه اما اگه عمل نکنه اولین رکورد که همون قدیمی ترینه رو انتخاب می کنه.

توضیح اضافه اینکه هر رکورد از جدول tblDevices چندتا فرزند توی tblPolomps داره و من میخوام مشخصات هر دستگاه رو با آخرین پلمپش کوئری کنم که با JOIN نمیشه.
کد php:
SELECT 
tblDevices
.ID
tblDevices.fldRoomID
tblDevices.fldName
tblDevices.fldModel
tblDevices.fldSerialNo
tblDevices.fldAmvalNo
tblDevices.fldDateEnter
tblDevices.fldDateEnterSh
tblDevices.fldDateExit
tblDevices.fldDateExitSh
tblDevices.fldReason
tblDevices.fldDescription
fldPolomp2.fldPolompNo,
fldPolomp1.MDate

FROM tblDevices inner join
    
(SELECT MAX(tblPolomps.fldPolompDate) as MDatetblPolomps.fldDeviceID 
    FROM tblPolomps 
    group BY fldDeviceID
)AS fldPolomp1  on fldPolomp1.fldDeviceID tblDevices.ID 
inner join tblPolomps fldPolomp2 on fldPolomp1
.fldDeviceID=fldPolomp2.fldDeviceID 
and fldPolomp1.MDate=fldPolomp2.fldPolompDate

WHERE tblDevices
.fldDateExitSh '' 

يه چند تا مشكل تايپي تو اسم تيبل ها وجود داشت كه تصحيحشون كردم
اميدوارم كمك كنه
خیلی ممنون آقا مهدی
اسم جدول ها رو فهمیدم منظورت چی بوده ولی برا فهمیدن تمام کد، 3 ساعت بهش ور رفتم :پی
حالا شما چند دقیقه ای کوئری رو نوشتی خدا میدونه :)

کارش درسته ولی من رکوردهایی هم دارم که فیلد تاریخشون خالیه چون دستگاه هایی هست که قبلا (زمان نامشخص) پلمپ شدن و الان فقط شماره شون ثبت میشه تا روزی که فک پلمپ بشن و ....

کلا این گزارش حذف بشه خدمت راحت تر میگذره :دی
خواهش مي كنم مجتبي جان شما خودت استادي

براي ركوردهايي كه تاريخ ندارن بايد فرض كنيم بزرگترين شماره ركوردي كه براي اون دستگاه ثبت شده احتمالا

مربوط به آخرين تاريخ پلمپ هست و اون رو نمايش بديم.

کد php:
SELECT 
tblDevices
.ID
tblDevices.fldRoomID
tblDevices.fldName
tblDevices.fldModel
tblDevices.fldSerialNo
tblDevices.fldAmvalNo
tblDevices.fldDateEnter
tblDevices.fldDateEnterSh
tblDevices.fldDateExit
tblDevices.fldDateExitSh
tblDevices.fldReason
tblDevices.fldDescription
fldPolomp2.fldPolompNo,
fldPolomp1.MDate

FROM tblDevices inner join
    
(SELECT MAX(tblPolomps.fldPolompDate) as MDatetblPolomps.fldDeviceID 
    FROM tblPolomps where tblPolomps
.fldPolompDate is not null
    group BY fldDeviceID
)AS fldPolomp1  on fldPolomp1.fldDeviceID tblDevices.ID 
inner join tblPolomps fldPolomp2 on fldPolomp1
.fldDeviceID=fldPolomp2.fldDeviceID 
and fldPolomp1.MDate=fldPolomp2.fldPolompDate

WHERE tblDevices
.fldDateExitSh '' 
union all
SELECT 
tblDevices
.ID
tblDevices.fldRoomID
tblDevices.fldName
tblDevices.fldModel
tblDevices.fldSerialNo
tblDevices.fldAmvalNo
tblDevices.fldDateEnter
tblDevices.fldDateEnterSh
tblDevices.fldDateExit
tblDevices.fldDateExitSh
tblDevices.fldReason
tblDevices.fldDescription
fldPolomp1.MaxNO as fldPolompNo,
'UnKnown' as MDate

FROM tblDevices inner join
    
(SELECT MAX(tblPolomps.fldPolompNo) as MaxNotblPolomps.fldDeviceID 
    FROM tblPolomps where tblPolomps
.fldPolompDate is  null
    group BY fldDeviceID
)AS fldPolomp1  on fldPolomp1.fldDeviceID tblDevices.ID 

WHERE tblDevices
.fldDateExitSh '' 
در ضمن لذت حل مسئله باعث مي شه گذر زمان رو متوجه نشي و خدمت زودتر بگذره !!
اميدوارم كمك كنه