आप आसानी से पतों को फ़िल्टर कर सकते हैं ([group] IN (48,59,60,87) OR Verified = 1)
, लेकिन TOP 1 में बदलाव करना चीजों को हास्यास्पद बना देगा (TOP (case when [group] IN (48,59,60,87) then 1 else (select count(*) from addresses where order_Id = o.order_Id) end)
. इसलिए मेरा प्रस्ताव है कि आप union all
do करें लेकिन केवल पतों के लिए:
SELECT TOP 1000 o.order_Id
, a.Address_Id
, a.Zip
--, *
FROM orders o
CROSS APPLY
(
select TOP 1
a.Address_Id,
a.Zip
from address a
WHERE a.order_Id = o.order_Id
AND o.[group] IN (48,59,60,87)
ORDER BY case a.Type
when 'D2' then 1
when 'K1' then 2
else 3
end,
a.ADD_DATE
UNION ALL
select
a.Address_Id,
a.Zip
from address a
WHERE a.order_Id = o.order_Id
AND o.[group] NOT IN (48,59,60,87)
AND Verified = 1
) a
WHERE
o.Status NOT IN (4, 6)
AND code1='002'
AND ((code2 IS NULL AND code3 IS NULL)
OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL)
OR (code2 IS NULL AND code3 = 'L'))
पी.एस. यदि आदेश में कोई पता नहीं है, तो क्रॉस एप्लाई को OUTER APPLY से बदल दें।