【问题标题】:How can I make one table that "overrides" another?我怎样才能让一张桌子“覆盖”另一张桌子?
【发布时间】:2011-04-07 01:11:18
【问题描述】:

假设我有两张桌子:

CREATE TABLE A(
    id INT PRIMARY KEY,
    x INT,
    y INT
)

CREATE TABLE B(
    id INT PRIMARY KEY,
    x INT,
    y INT,
)

表 A 包含从其他供应商引入的数据,而表 B 是我们的数据。为简单起见,我让这些表在架构方面完全相同,但表 B 可能是表 A 的超集(它会包含一些表 A 不会包含的列)。

我想做的是创建一个视图 C,其中包含列 id、x 和 y,以便值来自表 B,除非它们为 NULL,在这种情况下它们将来自表 A。例如,假设我有以下内容:

INSERT INTO A (id, x, y)
VALUES (1, 2, 3);

INSERT INTO B (id, x, y)
VALUES (1, NULL, NULL);

INSERT INTO A (id, x, y)
VALUES (2, 3, 4);

INSERT INTO B (id, x, y)
VALUES (2, 5, 6);

INSERT INTO A(id, x, y)
VALUES (3, 4, 5);

INSERT INTO B(id, x, y)
VALUES (3, 5, NULL);

所以如果我从 C 中选择 *,我会得到以下行:

(1, 2, 3)
(2, 5, 6)
(3, 5, 5)

如何创建这样的视图?

【问题讨论】:

    标签: sql mysql view


    【解决方案1】:

    您可以使用left join 将表格连接在一起,然后使用case 选择正确的列:

    select  case when A.x is null then B.x else A.x end
    ,       case when A.y is null then B.y else A.y end
    from    A
    left join
            B
    on      A.id = b.id
    

    【讨论】:

    • 或者使用 COALESCE(如果你被允许在视图中这样做,我不知道)。
    • 从问题来看,默认值应该来自B,而不是A。
    【解决方案2】:

    试试:

    Create view C as
    select  B.ID,
            coalesce(B.x,A.x) x,
            coalesce(B.y,A.y) y
    from    B
    left join A
    on   B.ID = A.ID
    

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2016-11-01
      • 1970-01-01
      相关资源
      最近更新 更多