0

これは非常に基本的なSQLの質問です。私が持っているのは、2つのテーブルを持つガレージのデータベースですCARS and SERVICES。各車は時々整備のために持ち込まれますので、各車は複数のSERVICESレコードを持つことができます。の各レコードにSERVICESは、関連する車を指す外部キー、日付フィールド、およびいくつかの追加情報フィールドがあります。

私が欲しいのは、最新のサービスからのすべての情報を含む車のリストを取得することです。私が単にするなら

SELECT C.ID, S.*
FROM CARS C
JOIN SERVICES S ON S.CAR_ID = C.ID

次に、各車のすべてのサービスを含むすべての車のリストを取得します(2つのデータセットのデカルト積)。私はMSSQLServerを使用しています。

4

2 に答える 2

3

SQL2005以降を使用している場合。次に、これを行うことができます:

;WITH CTE
AS
(
SELECT
    ROW_NUMBER() OVER(PARTITION BY CAR_ID 
                       ORDER BY theDateTimeColumn DESC) AS RowNbr,
    s.*
FROM
    SERVICES AS s
)
SELECT
    *
FROM
    CARS AS c
    JOIN CTE
        ON c.ID=CTE.CAR_ID 
        AND CTE.RowNbr=1

編集

整備されているかどうかに関係なく、すべての車を所有したい場合は、のLEFT JOIN代わりにを使用する必要がありますJOIN。このような:

;WITH CTE
AS
(
SELECT
    ROW_NUMBER() OVER(PARTITION BY CAR_ID 
                       ORDER BY theDateTimeColumn DESC) AS RowNbr,
    s.*
FROM
    SERVICES AS s
)
SELECT
    *
FROM
    CARS AS c
    LEFT JOIN CTE
        ON c.ID=CTE.CAR_ID 
        AND CTE.RowNbr=1
于 2012-05-04T08:49:46.460 に答える
2
SELECT
    CARS.ID,
    CARS.col2,
    ...,
    CARS.colm,
    SERVICES.SERVICE_TIME,
    ...,
    SERVICES.coln
FROM CARS
JOIN (
    SELECT A.CAR_ID, A.SERVICE_TIME, ..., A.coln
    FROM SERVICES AS A
    JOIN (
        SELECT CAR_ID, MAX(SERVICE_TIME) AS SERVICE_TIME
        FROM SERVICES
        GROUP BY CAR_ID
    ) AS B
    ON A.CAR_ID = B.CAR_ID
    AND A.SERVICE_TIME = B.SERVICE_TIME
) AS SERVICES
ON SERVICES.CAR_ID = CARS.ID
于 2012-05-04T08:48:49.157 に答える