2016-05-02 5 views
1

名前に関連付けられた最新のアドレスを取得しようとしています(通常、名前ごとに複数のアドレスがあるため)。私は、私の結合でサブクエリで次のクエリを作成しました。パーティーごとに1つのアドレスを取り戻すことができますが、アドレス/都市が常に一致するわけではありません。また、返されるアドレスは最新のアドレスではありません(関連する日付ごと)。 MAXを間違ってサブクエリを書いていますか?正しい都市が正しい住所になっていることを確認する方法はありますか?結合内の別々の最近のアドレス(複数のフィールド)のサブクエリ

select 
    [demographics].[DOB], 
    Address1, 
    Address2, 
    City, 
    State, 
    Zip 

from [demographics] 
    left join (select 
        [address].[demographic_ID], 
        max([address].[address1]) as Address1, 
        max([address].[address2]) as Address2, 
        max([address].[city]) as City, 
        max([states].[state_title]) as 'State', 
        max([dbo].[address].[zip]) as Zip 
       from [address] 
        inner join [states] on [address].[state_ID] = [states].[state_ID] 
       group by [address].[demographic_ID]) as AddressSub 
     on [demographics].[demographic_ID] = AddressSub.[demographic_ID]; 
+0

はい、間違って書いています。 MAXの代わりにTOP 1をどのように使用するかについて考えてみましょう。 –

+0

「Row_Number over(Date?ID?[最新のフィールドを決定するフィールドはどれか?])」のようなアナリシスを使用して、row_number 1に制限する方が簡単だと思います。 – xQbert

+0

はいちなみに、どのアドレスが最新であるかを判断する列が必要ですが、これは私のクエリでは使用されていません。 –

答えて

0

私はアドレステーブルのPKを知っておく必要があるだろうし、あなたが

SELECT 
    [demographics].[DOB], 
    Address1, 
    Address2, 
    City, 
    State, 
    Zip 

FROM [demographics] 
LEFT JOIN (SELECT 
      Row_number() over (partition by Demographic_ID ORDER BY Demographic_ID Desc) RN 
      [address].[demographic_ID], 
      [address].[address1] as Address1, 
      [address].[address2] as Address2, 
      [address].[city] as City, 
      [states].[state_title] as 'State', 
      [address].[zip] as Zip 
      FROM [address] 
      INNER JOIN [states] 
       on [address].[state_ID] = [states].[state_ID] 
      GROUP BY [address].[demographic_ID]) as AddressSub 
    on [demographics].[demographic_ID] = AddressSub.[demographic_ID] 
and AddressSub.RN = 1 
+0

あなたは 'demographic_id 'で分割したいと思っています。 –

+0

ええ、私は今参加しているのを見ることができます。しかし、それを注文する方法はまだ分かりません。最高の人口統計IDが最新のものであると仮定しない限り... – xQbert

+0

。 。何らかの種類の作成日や主キー(ID列であることがわかっている場合)によって注文したいと考えています。 –

0

「最近」を決定する方法、最新のアドレス欄

の最後のエントリでなければなりません。この権利を行うには
select 
[demographics].[DOB], 
Address1, 
Address2, 
City, 
State, 
Zip 

from [demographics] 
left join (select top 1 max([address.EntryDate) 
       [address].[demographic_ID], 
       [address].[address1] as Address1, 
       [address].[address2] as Address2, 
       [address].[city] as City, 
       [states].[state_title] as 'State', 
       [dbo].[address].[zip] as Zip 
      from [address] 
       inner join [states] on [address].[state_ID] = [states].[state_ID] 
      group by [address].[demographic_ID], 
       [address].[address1] as Address1, 
       [address].[address2] as Address2, 
       [address].[city] as City, 
       [states].[state_title] as 'State', 
       [dbo].[address].[zip] as Zip 

    on [demographics].[demographic_ID] = AddressSub.[demographic_ID]; 
0

あなたが実際に求めているものは、各列の最大(これらはアルファベット順の文字列です)フィールドです。これは、同じアドレス行からフィールドを返すことはまずありません。たとえば、address_1 = Z、address_2 = Aの2つの行があり、address_1 = Aとaddress_2 = Zの2つの行がある場合、ZとZが返されます(address_1は最初から、address_2は秒)。私はあなたが目指しているものとは思わない。

まず、そのオプションを使用している場合は、データベースを少し変更すると簡単に作業を進めることができます。あなたはあなたの人口統計に最新のアドレスIDを入れて、更新して、あなたが望むアドレスに直接リンクするのに使うことができます。または、作成した時刻や編集した時刻を保存しているアドレスに列を追加し、これを使って最新の時刻を取得することもできます。

また、上記のようにデータベースを変更したくない場合は、アドレスの最新の項目の識別子としてrownumberを使用してください。最初に、サブクエリでdemographic_idと最大値(rownumber)を戻してから、2番目のサブクエリにアドレスの残りの詳細を戻す必要があります。

0

SQLサーバーでこれにアプローチする方法の1つは、outer applyを使用することです(他のデータベースでは、これは「横結合」と呼ばれます)。あなたが最新のアドレスを決定するためのいくつかの方法を持っていると仮定すると、あなたが行うことができます:

select d.*, a.* 
from [demographics] d outer apply 
    (select a.*, s.state_title as state 
     from address a inner join 
      states s 
      on a.[state_ID] = s.[state_ID] 
     where a.demographic_ID = d.demographic_ID 
     order by ?? desc 
    ) a; 

(。私は、特定の列の詳細を残している)

??は "を定義する列を表し「最も最近の」 - たとえば、ID主キーまたはレコード作成日です。この場合、outer applyは基本的に複数の列を返すことを可能にする相関副照会です。

注:テーブルのエイリアスを使用することを強くお勧めします。彼らは、クエリをより簡単に書いて読めるようにします。

関連する問題