T-SQL选择与加盟条件(T-SQL Select join with condition)

2019-08-18 01:06发布

比方说,我有一个3个表:

  1. 汽车

    • ID
  2. CarColorHistory

    • ID
    • CarID
    • ColorID
    • 修改日期
  3. 颜色

    • ID
    • ColorName

我想选择所有小轿车和他们的颜色,但重要的是,这种颜色的车是从最后一次修改的颜色CarColorHistory表。

我需要用加入做到这一点。

例:

汽车:

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

我试图通过加入汽车表和CarColorHistory表做,但我得到汽车的所有颜色。 我只需要实际的颜色(最后加入)。

请帮忙

Answer 1:

有几种方法,你可以得到结果。 您可以使用子查询,以获得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拨弄演示

或者,因为你使用的是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拨弄演示



Answer 2:

试试这个:

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)


Answer 3:

这应该为你做的伎俩:

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


Answer 4:

要做到这一点可能是只使用子查询,因为你正在使用T-SQL,你也应该能够与应用做到这一点,像之前发布的一种方式:

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


Answer 5:

你可以试试这个,如果你有Sql Server 2005或更高版本:

您可以尝试在这里,如何Common table expression工作: 的Sql小提琴演示

  ;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


Answer 6:

我不知道这是否是最好的方式,但是这是我做的方式。 首先得到你想要的值超出使用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


文章来源: T-SQL Select join with condition