Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

TSQL pilih satu atau banyak baris untuk bergabung

Anda dapat memfilter alamat dengan mudah ([group] IN (48,59,60,87) OR Verified = 1) , tetapi mengutak-atik TOP 1 akan membuat segalanya menjadi konyol (TOP (case when [group] IN (48,59,60,87) then 1 else (select count(*) from addresses where order_Id = o.order_Id) end) . Jadi saya mengusulkan agar Anda melakukan union all tetapi hanya untuk alamat:

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. Jika pesanan mungkin tidak memiliki alamat, ganti CROSS APPLY dengan 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. Buat Fungsi Bernilai Tabel di SQL Server

  2. Bagaimana cara membagi string menggunakan char pembatas menggunakan T-SQL?

  3. dapatkan semua anak bersarang untuk id orang tua

  4. Sintaks salah di dekat kata kunci 'dengan'...pernyataan sebelumnya harus diakhiri dengan titik koma

  5. Kembalikan jumlah baris yang terpengaruh oleh pernyataan UPDATE