Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

TSQL избира един или много редове за присъединяване

Можете лесно да филтрирате адреси ([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 но само за адреси:

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'))

P.S. Ако поръчката може да няма адрес, заменете CROSS APPLY с OUTER APPLY.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Намерете и заменете всички специални символи в SQL

  2. SQL WHERE клауза, съответстваща на стойности с крайни интервали

  3. Изберете колона, ако другата колона е нула

  4. Вътрешно свързване на три маси

  5. Загуба на числена точност на SQL сървър 2005