Как я могу сделать одну таблицу, которая «перекрывает» другую? - PullRequest
6 голосов
/ 02 сентября 2010

Предположим, у меня есть две таблицы:

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. Например, предположим, что I было следующее:

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)

Как я мог создать такое представление?

Ответы [ 2 ]

8 голосов
/ 02 сентября 2010

Вы можете объединить таблицы вместе с 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
7 голосов
/ 02 сентября 2010

Попробуйте:

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
...