sql - 在没有一对一关系的情况下从一张表更新另一张表

标签 sql sql-server tsql sql-server-2000

我正在尝试填充一个日期表,其中包含 future 35 年的每个日期以及有关每一天的信息。

我的 ERP 系统有一个会计年度表 (GLRULE),它指定每个特定年份的会计期间,因为许多公司不按日历月份工作。

GLRule 表包含每个时期的一条记录,如下所示:

fcbasis  fcname    fcstatus  fdend              fdstart            flisadjust  flisaudit  fnnumber  freval  identity_column
A        FY 2000   C         1/28/2000 0:00:00  1/1/2000 0:00:00   FALSE       FALSE      1         FALSE   37
A        FY 2000   C         2/25/2000 0:00:00  1/29/2000 0:00:00  FALSE       FALSE      2         FALSE   38
A        FY 2000   C         3/31/2000 0:00:00  2/26/2000 0:00:00  FALSE       FALSE      3         FALSE   39
A        FY 2000   C         4/28/2000 0:00:00  4/1/2000 0:00:00   FALSE       FALSE      4         FALSE   40
A        FY 2000   C         5/26/2000 0:00:00  4/29/2000 0:00:00  FALSE       FALSE      5         FALSE   41
A        FY 2000   C         6/30/2000 0:00:00  5/27/2000 0:00:00  FALSE       FALSE      6         FALSE   42

无论如何,我可以使用类似于以下的查询一次更新一个字段:

UPDATE redfridaydates.dbo.testdates 
   SET [FISCAL_PERIOD]   = 
                (SELECT fnnumber
                  FROM m2mdata01..glrule GLR
                  where DATE >= GLR.FDSTART and DATE <= GLR.FDEND)

是否有更好的方法一次更新多个字段?我不知道如何才能这样做,因为我没有加入。

最佳答案

听起来您尝试更新的表对于每个日期都有一条记录。答案是这样假设的。如果您可以确保 GL 数据源没有重叠日期:

UPDATE T
SET T.[FISCAL_PERIOD] = GLR.fnnumber,
     T.Foo = GLR.Bar,
     T.Bat = GLR.Baz  --etc.

FROM redfridaydates.dbo.testdates  AS T
INNER JOIN m2mdata01..glrule AS GLR
ON T.[Date] BETWEEN GLR.FDSTART  AND GLR.FDEND

如果您有兴趣,这里有 proof of concept on some test data .

关于sql - 在没有一对一关系的情况下从一张表更新另一张表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3259956/

相关文章:

sql - 在部分 CHAR 列上创建索引

mysql - 在 mysql 中使用 IN 获取结果时添加列

php - 在 SQL 表中查找具有特定部分值列的行

sql - 不明确的列名错误,如何修复?

sql - 查询以获取具有最接近时间戳值的记录以获取两列的唯一组合

MySQL 5.7 GENERATED ALWAYS 列定义为子查询

python - 在 Sql Server 中对相同源/目标表使用 MERGE

sql - 用单独的列构建 View 列

sql - T-SQL 查询 - 无游标的行迭代

sql - TSQL:选择插入中的if语句