sql >> データベース >  >> RDS >> Sqlserver

TSQL 結合する 1 つまたは複数の行を選択します

    アドレスを簡単にフィルタリングできます ([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'))
    

    追記注文に住所がない可能性がある場合は、CROSS APPLY を OUTER APPLY に置き換えてください。




    1. 他のレコードの他の値に基づいて、データベースのレコードの値を計算する必要があります

    2. データベース/SQL:経度/緯度データを保存する方法は?

    3. ORA-29024:証明書の検証に失敗しました

    4. SQLサーバーがこのエラーをスローするのはなぜですか:値NULLを列'id'に挿入できませんか?