2

アカウントIDに基づいて2つのテーブルのすべてのフィールドを結合しようとしています。アカウントIDは表1で一意ですが、表2で繰り返されています。表2では、IDごとに1つのレコードのみを取得します。

表1:

ID...Field1....Field2

1......aa.........bb  
2......cc.........dd  
3......ee.........ff  
4......gg.........hh  

表2:

ID...Field3....Field4......Field5

1.....123........123...........123  
1.....345........546...........453   
2.....123........123...........123  
3.....123........123...........123  
4.....123........123...........722   
4.....123........123...........333  
4.....123........123...........123 

3つのフィールドの値に基づいて、表2からプルするIDを選択する必要があります。ロジックはこのように機能します。重複の中から、field3で最も高い値を持つIDレコードを選択します。それらがすべて同じである場合は、field4で最も高い値を持つものを選択します。それでも同じである場合は、で最も高い値を持つIDレコードを選択します。フィールド5。

そのため、最終結果は次のようになります。

ID....Field1.....Field2.....Field3.....5ield4.....Field5   
1........aa..........bb............345.......546.........452   
2........cc..........dd............123.......123.........123   
3........ee..........ff............123.......123.........123   
4........gg..........hh............123.......123.........722  

どうもありがとう!これはしばらくの間私を困惑させました

4

4 に答える 4

2

jdevelopには素晴らしいアイデアがありますが、field3がfield4などよりも優先される必要があるという事実は考慮されていません。

アクセスに行番号があるとは思わないので、物事が大幅に簡素化されます。私は長い間アクセスを使用していなかったので、以下を変更する必要があるかもしれませんが、それはほとんどそこまで到達するはずです。これが1回限りの作業である場合は、自動番号フィールドを並べ替えてから追加することができます。そうでない場合:

SELECT a.id, d.field3, d.field4, max(d.field5) as m_field5
FROM (((Table1 a
INNER JOIN (
    select id, max(field3) as m3
    from table2
    group by id
    ) b on a.id = b.id                        )
INNER JOIN (
    select id, field3, max(field4) as m4
    from table2
    group by id, field3
    ) c
    on b.id = c.id
    and b.m3 = c.field3                       )
INNER JOIN table2 d
    on c.id = d.id
    and c.field3 = d.field3
    and c.m4 = d.field4                       )
group by a.id, d.field3, d.field4

注:dbenhamのアドバイスに従って
編集注2:複数の結合を行う場合、アクセスには追加の括弧が必要になるため、結合に括弧を追加するように編集されました

1回限りの作業であるか、それ以外の方法で行番号を取得できる場合は、おそらく次のようなことを行うことができます。

select id, field3, field4, field5, rownumber
into #temp_ordered
from table2
order by id, field3, field4, field5

select a.*
from #temp_ordered a
inner join (
    select id, min(rownumber) min_rownumber
    from #temp_ordered 
    group by id
    ) b on a.id = b.id and a.rownumber = b.min_rownumber

最高、デビッド

于 2012-08-11T18:35:55.640 に答える
1

これにはMSSQLServerを使用していると思います。CROSS APPLY問題を解決するために使用する必要があります。

SELECT a.*, x.*
FROM   tb1 a 
CROSS APPLY 
(
    SELECT   TOP 1 *
    FROM     tb2 b
    WHERE    a.id = b.id
    ORDER BY f3 desc, f4 desc, f5 desc
) x

SQLFiddleデモ

于 2012-08-11T14:30:26.527 に答える
1

(この回答は、OPがAccessをターゲットデータベースとして特定する前に作成されました)

次のANSI構文は効率的であり、次のようなさまざまなデータベースで機能します。

  • Oracle 11以降(CTEがインラインビューに移動された場合は8iまでさかのぼります)
  • SqlServer2005以降
  • PostgreSQL8.4以降

with t2 as (
  select id,
         field3,
         field4,
         field5,
         row_number()
           over( partition by id
                 order by field3 desc, field4 desc, field5 desc
               ) as pref
    from table2
)
select t1.id,
       t1.field1,
       t1.field2,
       t2.field3,
       t2.field4,
       t2.field5
  from table1 t1
  join t2
    on t1.id=t2.id
   and t2.pref=1

Oracleには、KEEP LASTを使用するさらに効率的な方法があり、サブクエリやCTEが不要になります。SqlServer 2012は、構文が異なる同様の機能を導入した可能性があると思いますが、私はそれに精通していません。

select id,
       field1,
       field2,
       max(field3) keep (dense_rank last order by field3, field4, field5)
       max(field4) keep (dense_rank last order by field3, field4, field5)
       max(field5) keep (dense_rank last order by field3, field4, field5)
  from table1
  join table2 using(id)
 group by id

これが両方のOracleクエリのSQLフィドルです。

于 2012-08-11T18:15:39.400 に答える
0
 SELECT T1.ID,F1,F2,MAX(F3) F3,MAX(F4) F4,MAX(F5) F5
 FROM TBL1 T1,TBL2 T2
 WHERE T1.ID=T2.ID
 GROUP BY T1.ID,F1,F2
 ORDER BY T1.ID;
                  (OR)
 SELECT T1.ID,F1,F2,F3,F4,F5
 FROM TBL1 T1,(SELECT ID,MAX(F3) F3,MAX(F4) F4,MAX(F5) F5 FROM TBL2 GROUP BY ID) T2
 WHERE T1.ID=T2.ID
 ORDER BY T1.ID;

両方の解決策がうまくいくことを願っています。

于 2012-08-11T19:10:37.320 に答える