【发布时间】:2013-08-08 13:51:49
【问题描述】:
如何在更改已填充数据的表后,根据先前存在的外键 ID 使用值更新新列。
例子:
假设我有一个 CarSales 表,我在其中按个别汽车或汽车类型对销售数量进行分组:
ID | CarID | CarType | Quantity | SaleDate
1 | 1 | NULL | 2 | <some date>
2 | 2 | NULL | 3 | <some date>
3 | 2 | NULL | 1 | <some date>
4 | NULL | 'Trucks' | 12 | <some date>
...
CarID 是连接到表 Cars 的外键:
CarID | Color | PistonMotion
1 | 'Blue' | V
2 | 'Gray' | V
3 | 'Pink' | Linear
4 | 'Blue' | Linear
...
然后我决定还需要按活塞运动对销售数量进行分组,因此我在 CarSales 中添加了一个新列 PistonMotion:
ID | CarID | CarType | PistonMotion | Quantity | SaleDate
1 | 1 | NULL | NULL | 2 | <some date>
2 | 2 | NULL | NULL | 3 | <some date>
3 | 2 | NULL | NULL | 1 | <some date>
4 | NULL | 'Trucks' | NULL | 12 | <some date>
...
现在,CarSales 已经充满了数据(假设我有数千行),但我需要根据 PistonMotion 为表中的每一行更新 PistonMotion strong>CarID 与一次性操作位于同一行。因为我想在 CarSales 表中将 CarID 和 CarType 与 PistonMotion 一起分组,所以我不想将来只需对 Cars 表执行 JOIN 查询。我知道我将无法在 CarID 为 NULL 的行上更新 PistonMotion,但这没关系,因为这些不是我的实际表格,所以请忽略从此。
问题很简单:我需要什么查询才能更新 CarSales 中的 PistonMotion 使其等于 PistonMotion 中的 PistonMotion共享相同CarID的strong>汽车?
【问题讨论】:
-
如果
Cars已经提供此列,为什么还要将此列添加到CarSales? -
就像我已经提到的,这些不是我的真实表格,我只是做了一个非常简化的例子。实际情况要复杂得多,我不想详细说明为什么需要这样做。
-
加入更新很简单。您可以在下面的答案中看到。但是,无论是否简化,这都是糟糕的设计理念。未来的行呢?您将需要在两个表中插入相同的数据。如果
PistonMotion更改为Cars怎么办?更新很简单,在需要时从其他表中获取所需数据也很简单。 -
因为有时
CarSales表中没有CarID,但您仍然需要能够同时按CarType和PistonMotion进行分组。但是我意识到我应该将PistonMotion保留为NULL,其中有CarID值。
标签: sql sql-server