2

アクセスしているデータベースには、DB2 SQL を使用して照会する必要がある 2 つのテーブルがあり、ここでは nametable と addresstable として示されています。このクエリは、特定の残高が未払いのすべての人を検索するためのものです。アドレスは別のテーブルに保存され、アドレスの変更を追跡します。addresstable では、最新のアドレスはシーケンス番号 (ADDRSEQUENCE) によって決定されます。AddressID フィールドは両方のテーブルに存在し、各個人を特定の住所に関連付けるものです。最大のシーケンス番号が現在のアドレスです。各人の現在の住所が必要であり、その住所のみが必要です。シーケンス番号のどこかで MAX を使用する必要があることはわかっていますが、結合を指定して配置する方法がわかりません。これが私の現在のクエリです。もちろん、すべてのアドレスを返します...

SELECT NAMETABLE.ACCTNUM AS ACCOUNTNUMBER, 
NAMETABLE.NMELASTBUS AS LASTNAME,
NAMETABLE.NAME_FIRST AS FIRSTNAME, 
NAMETABLE.BALDUE AS BALANCEDUE,
ADDRESSTABLE.STREETNAME AS ADDR, 
ADDRESSTABLE.ADDRLINE2 AS 
ADDRLINE2,ADDRESSTABLE.CITYPARISH AS CITY, 
ADDRESSTABLE.ADDRSTATE AS STATE,
ADDRESSTABLE.ZIPCODE AS ZIP, 
ADDRESSTABLE.ADDIDSEQNO AS ADDRSEQUENCE
FROM NAMETABLE JOIN ADDRESSTABLE ON NAMETABLE.ADDRESSID = ADDRESSTABLE.ADDRESSID
WHERE NAMETABLE.BALANCEDUE >= '50.00'
4

2 に答える 2

3

MAX(ADDRSEQUENCE)次のようにサブ選択を行うことができます。

SELECT 
     N.ACCTNUM AS ACCOUNTNUMBER
    ,N.NMELASTBUS AS LASTNAME
    ,N.NAME_FIRST AS FIRSTNAME
    ,N.BALDUE AS BALANCEDUE
    ,A.STREETNAME AS ADDR, 
    ,A.ADDRLINE2 AS 
    ,A.ADDRLINE2
    ,A.CITYPARISH AS CITY, 
    ,A.ADDRSTATE AS STATE,
    ,A.ZIPCODE AS ZIP, 
FROM NAMETABLE AS N 
JOIN ADDRESSTABLE AS A 
  ON N.ADDRESSID = A.ADDRESSID
WHERE N.BALANCEDUE >= '50.00'
  AND A.ADDRSEQUENCE = (
    SELECT MAX(ADDRSEQUENCE)
    FROM ADDRESSTABLE AS A2
    WHERE A.ADDRESSID = A2.ADDRESSID
)

これは、DB2 ではかなり高速です。

于 2013-01-25T15:52:35.240 に答える
0

これを行うには、row_number と partition by を使用できます。このようなもの:

with orderedaddress as (
 select row_number() over (partition by ADDRESSID order by ADDRSEQUENCE desc) as rown,
 STREETNAME,ADDRESSID, ... from ADDRESSTABLE 
)
select NAMETABLE.ACCTNUM AS ACCOUNTNUMBER,
...
oa.STREETNAME 
...
from NAMETABLE JOIN orderedaddress oa on NAMETABLE.ADDRESSID = oa.ADDRESSID
where oa.rown = 1
and NAMETABLE.BALANCEDUE >= '50.00'
于 2013-01-25T15:49:22.653 に答える