4

私が3つのテーブルを持っているとしましょう:

    • Id
  1. CarColorHistory

    • Id
    • CarID
    • ColorID
    • 変更日
    • Id
    • ColorName

すべての車とその色を選択したいのですが、重要なのは、車の色がCarColorHistoryテーブルから最後に変更された色であるということです。

これを行うには、joinを使用する必要があります。

例:

車:

1
2

CarColorhistory:

1 1 1 26/03/2012  -> (actual color, can be take by date or id)
2 1 2 25/03/2012
3 2 2 25/03/2012

色:

1 Blue
2 Red

結果を取得する必要があります:(車ID、colorName)

1 Blue
2 Red

CarsテーブルとCarColorHistoryテーブルを組み合わせて作ってみましたが、すべての色の車が手に入ります。実際の色(最後に追加)だけが必要です。

助けてください

4

6 に答える 6

4

これを試して:

select c.id, colorname
from cars c
inner join CarColorHistory h on c.id = h.CarID
inner join Color c2 on h.colorid = c2.id
where h.ModificationDate = (select max(ModificationDate)
                            from CarColorHistory x where c.id = x.CarId)
于 2013-03-26T14:12:33.623 に答える
3

結果を得るにはいくつかの方法があります。サブクエリを使用してmax(modificationdate):を取得できます。

select c.id, r.colorname
from cars c
inner join CarColorhistory h1
  on c.id = h1.carid
inner join
(
  select max(modificationdate) MaxDate,
    carid
  from CarColorhistory
  group by carid
) h2
  on h1.carid = h2.carid
  and h1.modificationdate = h2.maxdate
inner join color r
  on h1.colorid = r.id

SQL FiddlewithDemoを参照してください

または、SQL Serverを使用しているため、ランキング関数を使用できます。

select id, colorname
from
(
  select c.id, r.colorname,
    row_number() over(partition by c.id order by modificationdate desc) rn
  from cars c
  inner join CarColorhistory h1
    on c.id = h1.carid
  inner join color r
    on h1.colorid = r.id
) src
where rn = 1;

SQL FiddlewithDemoを参照してください

于 2013-03-26T14:14:16.667 に答える
1

これはあなたのためのトリックをするはずです:

SELECT c.id, (
    SELECT co.ColorName FROM Color co
    WHERE co.id = (
        SELECT TOP 1 ColorID FROM CarColorHistory
        WHERE CarID = c.id
        ORDER BY ModificationDate DESC
    )
 ) AS ColorName
于 2013-03-26T14:10:25.730 に答える
0

これを行う1つの方法は、以前に投稿されたように、サブクエリを使用することです。t-sqlを使用しているため、applyを使用して実行することもできます。

SELECT
        Cars.Id, LatestColors.ColorID, LatestColors.ModificationDate
    FROM Cars
    CROSS APPLY (
        SELECT TOP 1
                ColorID, ModificationDate
            FROM CarColorHistory
            WHERE CarID = Cars.ID
            ORDER BY ModificationDate DESC
    ) AS LatestColors
于 2013-03-26T14:18:59.713 に答える
0

あなたが持っているSql Server 2005かそれ以上の場合、これを試すことができます:

ここで試すことができます、どのように機能していますかCommon table expressionSqlFiddleデモ

  ;WITH CTE_Cars(CarID, MaxDate)
    AS
    (
    SELECT CarID, MAX(ModificataionDate) AS MaxDate
    FROM CarColorHistory
    GROUP BY CarID
    )
    SELECT CTE_Cars.CarID, Color.ColorName
    FROM 
    CTE_Cars
    INNER JOIN CarColorHistory ON CarColorHistory.CarID = CTE_Cars.CarID AND
    CarColorHistory.ModificataionDate = CTE_Cars.MaxDate
    INNER JOIN Color ON Color.id = CarColorHistory.ColorId
于 2013-03-26T14:22:42.447 に答える
0

これが最善の方法かどうかはわかりませんが、これが私のやり方です。最初にMAXを使用してテーブルから必要な値を取得し、次にその結果をテーブルとして使用して、JOIN不要な値を削除します。

SELECT c.ID, Color.Color
From Cars c JOIN CarColorHistory h on c.id = h.CarID
     JOIN Color on h.ColorID = Color.ID
     JOIN

    --Create a table with only the latest value and the car ID
    ( 
    SELECT c.ID, Max(h.TimeStamp) as time
    FROM Cars c JOIN CarColorHistory h on c.id = h.CarID
         JOIN Color on h.ColorID = Color.ID
    Group by c.ID --Join the table on latest time to get rid of old timestamps
    ) Max on Max.ID = c.ID and h.TimeStamp=max.time
于 2013-03-26T14:30:32.797 に答える