sql >> Database >  >> RDS >> Sqlserver

TSQL selecteer een of meerdere rijen om mee te doen

U kunt adressen gemakkelijk filteren ([group] IN (48,59,60,87) OR Verified = 1) , maar het aanpassen van TOP 1 zou dingen belachelijk maken (TOP (case when [group] IN (48,59,60,87) then 1 else (select count(*) from addresses where order_Id = o.order_Id) end) . Dus ik stel voor dat je union all . doet maar alleen voor adressen:

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

PS Als de bestelling geen adres heeft, vervang dan CROSS APPLY door OUTER APPLY.




  1. PostgreSQL op Corda enterprise node genereert relatiefouten

  2. Hoe een relatie te vinden uit Snomed Postgres Sql Database

  3. MySQL-connector compileren met Visual Studio 2015 Win64

  4. Toegang geweigerd voor gebruiker 'root'@'localhost' tijdens een poging om privileges te verlenen. Hoe verleen ik privileges?