0

私はこの問題で立ち往生しています。一部のレコードが社内と社外で同時に存在するというクエリに重複があります。私は外よりも社内の方が好きですが、社内からの入り口がない場合は外の方が望ましいです。

製品からID、日付、場所を選択します

id date        location
----------
2  01/01/2012  in-house
2  05/01/2012  outside <- in this situation i want to keep just in-house

id date        location
----------
4  01/01/2012  in-house
5  03/01/2012  outside <- in this situation i want to keep both since there is no db entry for id=5 therefor i have just info from outside

誰か助けてもらえますか?

4

1 に答える 1

1

これを行う1つの方法は、テーブルからそれ自体への完全な外部結合を実行してから、合体を使用することです。

 Select 
    COALESCE(Inside.Id, outside.id) Id,
    COALESCE(Inside.date, outside.date) Date,
    COALESCE(Inside.location, outside.location) Location
From 
    prod Inside
    FULL OUTER JOIN prod Outside
    ON Inside.id = Outside.iD
    and Inside.location <> Outside.Location
Where
    (Inside.Location = 'in-house'
    or 
    Inside.Location is null)
    and 
    (outside.Location = 'outside'
     or
     outside.Location is null)

デモ

ノート:

フィールドがnull許容になる可能性がある場合は、合体の代わりにCaseステートメントを使用し、IDフィールドを使用して使用するテーブルを決定することをお勧めします。例として日付を使用する

CASE WHEN Inside.Id is not null THEN Inside.date ELSE outside.date END date

デムズが指摘したように、これもそれ{id, location}がユニークであると仮定しています。

アップデート

SQL Serverを使用していて、{ID、Location}は一意ではなく、最大の日付値が必要であり、常に外部ではなく社内を選択するためROW_NUMBER/WHERE RowNumber = 1、ここでは、最初に場所で、次に日付で並べ替えることで、効果的に使用できます。

WITH cte 
     AS (SELECT Row_number() OVER ( partition BY ID 
               ORDER BY CASE LOCATION WHEN  'in-house' THEN 0  
                                      WHEN  'outside' THEN 1 END, 
                        DATE DESC) rn, 
                ID, 
                Date, 
                Location 
         FROM   prod) 
SELECT ID, 
       Date, 
       Location 
FROM   cte 
WHERE  rn = 1 

デモ

注caseステートメントを使用する必要はありませんでしたが、マッピングを明示的にしたかったのです。

于 2012-05-22T16:30:26.883 に答える