【问题标题】:Merge SQL Tables and autofill new records合并 SQL 表并自动填充新记录
【发布时间】:2017-12-22 17:08:19
【问题描述】:

我有两张表需要合并在一起。合并将采用日期表,将其添加到包含其他信息的表中,并在这样做时创建新记录。有没有办法使用第一条记录中的信息自动完成新记录。示例:

表 1:

Tag  location  Due Date
1       5       

表 2:

Date
1/1/17
1/7/17
1/14/17
1/21/17

当我合并时,我希望表 1 看起来像:

Tag  location  Due Date
1       5       1/1/17
                1/7/17
                1/14/17
                1/21/17

并让标签 # 和位置 # 自动填充,以便每条新记录显示 1 和 5。

【问题讨论】:

  • 这里的标准是什么?您想要的结果中的每条新记录都不会显示 1 和 5……只是第一个。你在这里使用什么逻辑/你能解释得更好吗?如果表 1 中有更多记录怎么办。它会是什么样子?哪个记录会得到哪个日期?
  • 正确标记!!!!这是哪一个???? SQL Server 或 MySQL,不能两者兼得!!!

标签: mysql sql merge


【解决方案1】:

您可以使用交叉连接:

SELECT * FROM table1 CROSS JOIN table2

这会将每个表的每一行连接到另一个表中的每一行。在您发布的有限示例中,您将获得所有不同的日期,并且标签/位置将重复。如果有两个标签/位置,你会得到 8 行,每个日期会出现两次,每个标签/位置对会出现 4 次等等。

另一个例子:

TableA TableB
A      1
B      2
C      3

A cross join B

A1 A2 A3 B1 B2 B3 C1 C2 C3

【讨论】:

    【解决方案2】:

    如果我明白你的意思,这将完成工作:

    CREATE TABLE Table1 (
        Tag INT,
        Location INT,
        DueDate DATE
        );
    CREATE TABLE Table2 (
        MyDate DATE
        );
    INSERT INTO Table1 VALUES
    (1, 5, NULL);
    
    INSERT INTO Table2 VALUES
    ('2017-01-01'),
    ('2017-01-07'),
    ('2017-01-14'),
    ('2017-01-21');
    
    
    INSERT INTO Table1 (Tag, Location, DueDate)
    SELECT CASE WHEN RN = 1 THEN Tag END,
           CASE WHEN RN = 1 THEN Location END,
           MyDate
    FROM
    (
        SELECT T1.Tag,
               T1.Location,
               T2.MyDate,
               ROW_NUMBER () OVER (PARTITION BY Tag ORDER BY Tag) AS RN
        FROM Table1 T1 CROSS JOIN Table2 T2 
    ) SQ;
    
    DELETE FROM Table1 WHERE DueDate IS NULL;
    
    SELECT *
    FROM Table1;
    

    结果:

    +------+----------+---------------------+
    | Tag  | Location |       DueDate       |
    +------+----------+---------------------+
    | 1    | 5        | 01.01.2017 00:00:00 |
    | NULL | NULL     | 07.01.2017 00:00:00 |
    | NULL | NULL     | 14.01.2017 00:00:00 |
    | NULL | NULL     | 21.01.2017 00:00:00 |
    +------+----------+---------------------+
    

    如果要填充 TagLocation 列,请使用:

    INSERT INTO Table1 (Tag, Location, DueDate)
    SELECT T1.Tag,
           T1.Location,
           T2.MyDate
    FROM Table1 T1 CROSS JOIN Table2 T2;
    
    DELETE FROM Table1 WHERE DueDate IS NULL;
    
    SELECT *
    FROM Table1;
    

    【讨论】:

    • 从上面的解释来看,他似乎不希望 Tag 和 Location 中有 NULL 值,而是希望它们分别自动填充 1 和 5。
    • @KindaTechy 我虽然 我希望表 1 看起来像 是预期的结果。更新答案;)
    【解决方案3】:

    请使用这个。这在 mysql Server 和 MS SQL SERVER 中运行良好

    select k.Tag,k.Location,u.Mydate Mydate
    from
    (
        SELECT T1.Tag,
                T1.Location,
                MIN(T2.MyDate) MyDate
        FROM Table1 T1 CROSS JOIN Table2 T2 
        GROUP BY T1.Tag,
                T1.Location
    )k 
    RIGHT JOIN 
    (
        SELECT T1.Tag,
                T1.Location,
                T2.MyDate
        FROM Table1 T1 CROSS JOIN Table2 T2     
    )u ON k.Tag = u.Tag AND k.Location = u.Location
    AND k.MyDate = u.Mydate
    
    
    /*------------------------
    OUTPUT
    ------------------------*/
    Tag         Location    Mydate
    ----------- ----------- ----------
    1           5           2017-01-01
    NULL        NULL        2017-01-07
    NULL        NULL        2017-01-14
    NULL        NULL        2017-01-21
    
    (4 row(s) affected)
    

    【讨论】:

      猜你喜欢
      • 2021-10-30
      • 1970-01-01
      • 2011-07-29
      • 2014-03-31
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多