1

それぞれからいくつかの情報を抽出するクエリで2つのテーブルを結合したいのですが、2番目のテーブルにはTOP1が必要です。

これは私の人々のリストを取得します

SELECT [Clock no], [Card id], [Current pay cat], [Pay category] 
FROM Employees EMP 
WHERE [Clocked in flag] = 'Y'

次に、そのテーブル内の各ユーザーについて、このクエリに参加します。

SELECT TOP 1 [Start time], Dated FROM [Work records] WR 
WHERE WR.[Clock no] = XXXXXXXXX <- Clock no from first query
AND WR.Dated <= '2013-01-07' AND WR.[Open flag] = 'Y' 
ORDER BY WR.[Dated] DESC, WR.[Start time] DESC

私がこれまでに持っているのはこのようなものですが、ORDERBy句を追加するとすぐに機能するようには見えません。

SELECT EMP.[Clock no], [Card id], [Current pay cat], [Pay category], WRTOP.[Start time], WRTOP.[Dated]
FROM Employees EMP 
LEFT JOIN (
SELECT TOP 1 [Clock no], [Start time], Dated FROM [Work records] WR 
WHERE WR.Dated <= '2013-01-07' AND WR.[Open flag] = 'Y' 
ORDER BY WR.[Dated] DESC, WR.[Start time] DESC
) WRTOP 
ON (EMP.[Clock no] = WRTOP.[Clock no])
WHERE EMP.[Clocked in flag] = 'Y'
4

1 に答える 1

2

サブクエリは1つの行を返しますが、必ずしも右の行である必要はありませんClock no。右を見るだけでClock no、サブクエリと外部テーブルの関係が必要になります。それはでは許可されていませんjoin

onこれを回避する1つの方法は、次のような条件のサブクエリです。

SELECT  EMP.[Clock no]
,       EMP.[Card id] 
,       EMP.[Current pay cat]
,       EMP.[Pay category]
,       WR.[Start time]
,       WR.[Dated]
FROM    Employees EMP 
JOIN    [Work records] WR 
ON      WR.[Open flag] = 'Y' 
        AND WR.[Clock no] = EMP.[Clock no]
        AND WR.Dated =
        (
        SELECT  max(Dated)
        FROM    [Work records] WR2
        WHERE   WR2.[Open flag] = 'Y'
                AND WR2.[Clock no] = EMP.[Clock no]
                AND WR2.Dated <= '2013-01-07'
        )
        AND WR.[Start time] =
        (
        SELECT  max([Start time])
        FROM    [Work records] WR3
        WHERE   WR3.[Open flag] = 'Y'
                AND WR3.[Clock no] = EMP.[Clock no]
                AND WR3.Dated = 
                (
                SELECT  max(Dated)
                FROM    [Work records] WR4
                WHERE   WR4.[Open flag] = 'Y'
                        AND WR4.[Clock no] = EMP.[Clock no]
                        AND WR4.Dated <= '2013-01-07'
                )
        )
WHERE EMP.[Clocked in flag] = 'Y'
于 2013-01-07T12:56:31.177 に答える