0

IB という名前のテーブルを以下のコードに結合する必要があります。IB から次のフィールドを取得する必要があります: QOO、QOH、QCM、および AVG。JOIN 条件は、IJ.IJITEM = IB.IBITEM および IJ.IJLOC = IB.IBLOC です。

;WITH cte AS 
    (
      SELECT IJLOC, IJITEM, IJDATE, IJLCGT,
        rn = ROW_NUMBER() OVER (PARTITION BY IJITEM, IJLOC ORDER BY IJDATE DESC)
      FROM dbo.IJ
    )
    SELECT IJLOC, IJITEM, IJDATE, IJLCGT
    FROM cte WHERE rn = 1;
4

2 に答える 2

1

最終的な SELECT で IB テーブルを "cte" に JOIN するよりも少し複雑な方法の 1 つは、現在の CTE をテーブルとして使用して別の CTE をネストすることです。例えば:

;WITH cte AS 
(
    SELECT IJLOC, IJITEM, IJDATE, IJLCGT,
    rn = ROW_NUMBER() OVER (PARTITION BY IJITEM, IJLOC ORDER BY IJDATE DESC)
    FROM dbo.IJ
),
filtered AS (
    SELECT IJLOC, IJITEM, IJDATE, IJLCGT
    FROM cte
    WHERE rn = 1
)
SELECT  ib.QOO, ib.QOH, ib.QCM, ib.[AVG]
FROM    ib
INNER JOIN filtered
        ON filtered.IJITEM = IB.IBITEM
        AND filtered.IJLOC = IB.IBLOC

別のオプションは、クエリ オプティマイザーがすべてのテーブル間の JOIN を処理する方法に応じて、IJ テーブルからフィールドを返す必要がない場合、CTE の結果を一時テーブルに挿入してから JOIN することです。それに。例えば:

CREATE TABLE #Temp (IJITEM DataType, IJLOC DataType)

;WITH cte AS 
(
    SELECT IJLOC, IJITEM, IJDATE, IJLCGT,
    rn = ROW_NUMBER() OVER (PARTITION BY IJITEM, IJLOC ORDER BY IJDATE DESC)
    FROM dbo.IJ
)
INSERT INTO #Temp (IJITEM, IJLOC)
    SELECT IJITEM, IJLOC
    FROM cte
    WHERE rn = 1;

SELECT  ib.QOO, ib.QOH, ib.QCM, ib.[AVG]
FROM    ib
INNER JOIN #Temp tmp
        ON tmp.IJITEM = IB.IBITEM
        AND tmp.IJLOC = IB.IBLOC
于 2013-11-05T18:52:34.653 に答える