1

望ましくない重複を表示する結果があります。addresstypes を呼び出す列があり、db に入力された内容に応じて B または L を返します。B が選択された場合、これは配送先と正式な住所の両方であるため、データを入力するのは正しくありません。

データを引っ張ると連番などは出るのですが、B&L両方に住所データがあるものは2回出ます。

これが私のクエリです - どうすれば二重行を表示しないようにできますか?

USE inventory
SELECT distinct
dbo.addressinfo.locationinfoid, dbo.equipmentlocationscurrent.serialnum,    dbo.addressinfo.addresstype
FROM dbo.equipmentlocationscurrent
full join dbo.addressinfo
on  dbo.equipmentlocationscurrent.locationinfoid = dbo.addressinfo.locationinfoid
where  (clientName = 'cps lease')
and (locationtype = 'merchant')
and (addresstype = 'b' or addresstype = 'l')
order by serialnum

結果のサンプル

locationinfoid  serialnum
2887540       301-252-800   B
2887540       301-252-800   L
4

3 に答える 3

1

あなたのコメントによると、addresstype各にどの値を選択するかは問題ではないため、 with をlocationinfoid使用GROUP BY locationinfoid, serialnumMAXます。

SELECT
  a.locationinfoid, 
  e.serialnum, 
  MAX(a.addresstype)
FROM dbo.equipmentlocationscurrent AS e
full join dbo.addressinfo AS a on e.locationinfoid = a.locationinfoid
where clientName = 'cps lease'
 and locationtype = 'merchant'
 and addresstype = 'b' or addresstype = 'l'
GROUP BY a.locationinfoid, e.serialnum
order by serialnum;

これにより、 の異なる値が得られますlocationinfoid

于 2013-03-15T15:10:06.647 に答える
0

あなたには多くの選択肢があり、

  • 結果から Address Type を除外し、distinct を使用します
  • 集計関数を使用し、関数ごとにグループ化する
  • 重複を知っているか、クロージュールの交差結合を作成します

アドレスの種類を取得したくないが、重複を知りたい場合は、クエリを次のように書き直します。

SELECT     A.locationinfoid, E.serialnum
FROM dbo.equipmentlocationscurrent E
inner join dbo.addressinfo A
on  E.locationinfoid = A.locationinfoid
where  (clientName = 'cps lease')
and (locationtype = 'merchant')
and (addresstype = 'b')
order by serialnum

INTERSECT

SELECT     A.locationinfoid, E.serialnum
FROM dbo.equipmentlocationscurrent E
inner join dbo.addressinfo A
on  E.locationinfoid = A.locationinfoid
where  (clientName = 'cps lease')
and (locationtype = 'merchant')
and (addresstype = 'L')
order by serialnum

それらをすべて取得したいだけの場合は、個別を使用して選択に AddressType を含めないでください

 SELECT  DISTINCT   A.locationinfoid, E.serialnum
    FROM dbo.equipmentlocationscurrent E
    FULL join dbo.addressinfo A
    on  E.locationinfoid = A.locationinfoid
    where  (clientName = 'cps lease')
    and (locationtype = 'merchant')
    and (addresstype IN('b', 'l'))
    order by serialnum

また、句に MAX や MIN などの集計関数を使用することもできます。この方法では、個別の句を使用する必要はありません。

SELECT  A.locationinfoid, E.serialnum, MAX(A.addresstype ) AS addresstype 
        FROM dbo.equipmentlocationscurrent E
        FULL join dbo.addressinfo A
        on  E.locationinfoid = A.locationinfoid
        where  (clientName = 'cps lease')
        and (locationtype = 'merchant')
        and (addresstype IN('b', 'l'))
        Group by  A.locationinfoid, E.serialnum
        order by serialnum
于 2013-03-15T15:14:06.367 に答える
0

Distinct は、選択リストに含まれる任意の列の個別のレコードを返します。したがって、 の値が異なる場合addressinfo.locationinfoidserialnumまたはaddressinfo.addresstype重複したレコードを取得することになります

この場合、2 つの異なるものを取得しているように見えるため、とペアにそれぞれ 1 つずつあるaddresstypes場合、2 つの「重複」レコードが取得されます。戻り値を含めるように編集すると、これが確認されます。locationinfoidserialnum

気にしない場合addresstypeは、選択リストに含めないでください。試す:

USE inventory
SELECT distinct
dbo.addressinfo.locationinfoid, dbo.equipmentlocationscurrent.serialnum
FROM dbo.equipmentlocationscurrent
full join dbo.addressinfo
on  dbo.equipmentlocationscurrent.locationinfoid = dbo.addressinfo.locationinfoid
where  (clientName = 'cps lease')
and (locationtype = 'merchant')
and (addresstype = 'b' or addresstype = 'l')
order by serialnum
于 2013-03-15T15:08:22.453 に答える