Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

TSQL wybierz jeden lub wiele wierszy do przyłączenia

Możesz łatwo filtrować adresy ([group] IN (48,59,60,87) OR Verified = 1) , ale podkręcanie TOP 1 sprawiłoby, że wszystko byłoby niedorzeczne (TOP (case when [group] IN (48,59,60,87) then 1 else (select count(*) from addresses where order_Id = o.order_Id) end) . Proponuję więc zrobić union all ale tylko dla adresów:

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 Jeśli zamówienie może nie mieć adresu, zamień CROSS APPLY na 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. Baza danych kopii zapasowych SQL Server Express | Jak zaplanować automatyzację i czyszczenie kopii zapasowej SQL Express

  2. Pobierz nazwy kolumn z zapytania bez danych

  3. Wybierz znak cyrylicy w SQL

  4. Jak uzyskać listę tabel bez ograniczenia klucza podstawowego we wszystkich bazach danych instancji SQL Server - SQL Server / TSQL Tutorial, część 62

  5. Wgląd w unikalne ograniczenia SQL Server