2017-11-07 6 views
0

私は2つのテーブルAとBを持っています。テーブルAは、各ユーザごとに複数のレコードを持つことができます。表Bは、ここで表AにSQL Server 2008の最新のレコードのみに参加する方法は?

を行ごとに複数のレコードを持つことができる例である。

Table A     Table B 
    a_id a_key  b_id b_key b_AtblID 
1. 6678 5778  1. 6509 5778 6678 
2. 6679 5778  2. 6508 5778 6678 
        3. 6507 5778 6679 
        4. 6505 5778 6679 
        5. 6490 5778 6678 

は、表2のレコードを見ることができます。 1レコードはBテーブルに3レコード、Bテーブルには2レコードがあります。

テーブルAのレコードとBテーブルの最新のレコードをプルするクエリが必要です。テーブルBのすべてのレコードがテーブルAのレコードと一致する必要はありません。ここで私が持っているものの一例ですが、私のコードは、テーブルBからすべてのレコードを引っ張っ:

SELECT * 
FROM A 
    LEFT OUTER JOIN B 
     ON b_AtblID = (
      SELECT TOP 1 b_AtblID 
      FROM B 
      WHERE b_AtblID = a_id 
      ORDER BY b_id DESC 
     ) 

私は私のコードは、テーブルAの上の行ごとに1つのレコードのみを返すことを期待していたが、私は、テーブルBからすべてのレコードを得ました誰かが助けてくれたら教えてください。ありがとう。

+0

私はここを参照してください最大の問題は、あなたがこれらの2つのテーブル間の多くの関係に多くを持っているということです。これは多くの課題を引き起こします。この関係を管理するためにブリッジテーブルを利用する方が良いでしょう。あなたはデザインを修正することができますか? –

+0

b_idはBテーブルの主キーです。私はテーブルのアーキテクチャを変更することはできません。これは私が維持しなければならない古いシステムです... –

+0

最新のレコードのためのあなたの基準は何ですか? 'max''b_id'? – zarruq

答えて

4

あなたはROW_NUMBERを使用することができます。

WITH CTE AS 
(
    SELECT *, 
      RN = ROW_NUMBER() OVER(PARTITION BY b_AtblID ORDER BY b_id DESC) 
    FROM dbo.TableB 
) 
SELECT * 
FROM dbo.TableA a 
INNER JOIN CTE b 
    ON a.a_id = b.b_AtblID 
    AND b.RN = 1 
; 

またはCROSS APPLY

SELECT * 
FROM dbo.TableA a 
CROSS APPLY (SELECT TOP 1 * 
      FROM dbo.TableB 
      WHERE b_AtblID = a.a_id 
      ORDER BY b_id DESC) b; 
+0

私はあなたが窓の機能を拡張する必要があると思う:私は質問を理解したように 'ROW_NUMBER()OVER(区切りb_key、b_AbtlID ORDER BY b_id) ' – Tyron78

+0

@ Tyron78、私は必要を参照してくださいない – Lamak

+0

私はクロス適用ソリューションエラーが発生し続ける ';' –

0
Create table #tempA (a_id int,a_key int) 
Create table #tempB (b_id int,b_key int,b_abtlid int) 
Insert into #tempA values(6678,5778),(6679,5778) 
Insert into #tempB values(6509,5778,6678),(6508,5778,6678),(6507,5778,6679),(6505,5778,6679),(6490,5778,6678) 


select a_id,a_key,b_id,b_abtlid from (
select *,row_number() over(partition by a_id order by b_id desc)as Rn from #tempA a 
inner join #tempB b 
on a.a_id=b.b_abtlid) t 
where t.Rn=1 
関連する問題