簡體   English   中英

創建視圖以從多個表中獲取值

[英]Create view to get values from multiple tables

我認為編輯這篇文章並給出確切的例子畢竟更容易些。

主要思想是我需要從不同的表中獲取值。

基本上,主要思想是從表B和表C中選擇所有值,但僅從表C中選擇表B中不存在的值(但同時我需要離開表C以獲取文本列值)。 表B和表C具有相似的結構。 它們都具有ref_num(ID)和文本值。 另外,表B保留表C ref_num,因為修改表C實體(“ modifiable_column”)后,記錄將保存到表B中,但“默認”值文本列是從表C中獲取的。

有點像。 假設我們有默認規則(表C-永遠永遠相同),然后有自定義規則(表B)。 表D包含每個規則的版本,當前版本為end_date IS NULL。 如前所述,默認值的默認“ modifiable_column”為“ N”。 現在,假設我從表C中采用了一條規則,並將“ modifiable_column”更改為“ Y”。 然后,將新行創建到表B中(帶有ref_num,table_c_ref_num,text = NULL)。 這意味着該規則現在是針對此特定TabelA ref_num定制的,同時將新行插入到表D中(將新行ref_num保留為table_b_ref_num和新的“ modifiable_column”值)。 現在,當我要選擇自定義規則時,將使用默認規則和版本(end_date IS NULL)。 我必須聯接表B,表C和表D。但是由於表C始終具有相同的規則,因此我只需要聯接它即可獲取文本值。 而且我必須確保不會選擇重復項。 這意味着如果表C具有10條默認規則,則現在修改了一條,而自定義規則(表B)具有1條規則。 然后,我不得不說,從表B中選擇1,從表C中選擇9,但是同時我需要為此自定義規則加入表C文本值。

我有以下表格:

create table TableA (
    ref_num INT
);

create table TableB (
    ref_num INT,
    text VARCHAR(100),
    table_c_ref_num INT,
    table_a_ref_num INT
);

create table TableC (
    ref_num INT,
    text VARCHAR(100)
);

create table TableD (
    ref_num INT,
    table_b_ref_num INT,
    modfifable_column VARCHAR(1),
    start_date date,
    end_date date
);

插入初始值,如下所示:

insert into TableA (ref_num) values (1);
insert into TableC (ref_num, text) values
(1, "Text 1"),
(2, "Text 2"),
(3, "Text 3");
insert into TableB (ref_num, text, table_c_ref_num, table_a_ref_num) values
(1, NULL, 2, 1);
insert into TableD (ref_num, table_b_ref_num, modfifable_column, start_date, end_date) values
(1, 1, 'Y', now(), NULL);

現在,我創建了這個select語句來獲取想要的行為:

SELECT * FROM (
    SELECT
        tb.ref_num AS ref_num,
        tb.table_a_ref_num AS table_a_ref_num,
        coalesce(tc.text, tb.text),
        coalesce(tc.ref_num, tb.table_c_ref_num) AS table_c_ref_num,
        coalesce(td.modfifable_column, 'N') AS modfifable_column
    FROM TableB tb
    LEFT JOIN TableD td on td.table_b_ref_num = tb.ref_num AND td.end_date IS NULL
    LEFT JOIN TableC tc on tc.ref_num = tb.table_c_ref_num
    WHERE tb.table_a_ref_num = 1
) as cust
UNION ALL
SELECT * FROM (
    SELECT
    NULL AS ref_num,
    NULL AS table_a_ref_num,
    tc2.text AS text,
    tc2.ref_num AS table_c_ref_num,
    'N' AS modfifable_column
    FROM TableC tc2
    WHERE tc2.ref_num NOT IN (
        SELECT
        tb2.table_c_ref_num
        FROM TableB tb2
        LEFT JOIN TableD td on td.table_b_ref_num = tb2.ref_num AND td.end_date IS NULL
        LEFT JOIN TableC tc on tc.ref_num = tb2.table_c_ref_num
        WHERE tb2.table_a_ref_num = 1
    )
) as def;

我知道我可以將這兩個內部SELECT語句轉換為視圖,然后將它們與UNION ALL結合使用。 我最大的擔心是,我必須將table_a_ref_num = 1“硬編碼”到兩個不同的位置。 因為我必須使用TableA ref_num才能從TableB獲取自定義值和從TableC獲取默認值。 因為最后TableA ref_num類似於“此特定”實體自定義規則和默認規則。

我的問題是:有沒有一種方法可以將我的大SELECT子句包裝到一個視圖中,在該視圖中,可以使用此TableA ref_num值來獲取結果,如示例所示。

我不完全了解您的表和偽代碼,但是基於這種有限的理解,我的建議是從類似以下查詢開始:

select 'ta',ta.*,'tb',tb.*,'tc_via_b',tc_via_b.*,'tc_via_a',tc_via_a.*,'td',td.*
from      table_a ta
left join table_b tb       on tb.table_a_ref_num = ta.ref_num
left join table_c tc_via_b on   tc_via_b.ref_num = tb.table_c_ref_num
left join table_c tc_via_a on   tc_via_a.ref_num = ta.ref_num
left join table_d td       on td.table_b_ref_num = tb.ref_num AND td.end_date IS NULL;

這樣,您將看到第一步所需的所有行。 在第二步中,您應該能夠使用NVLCASE來獲取所需的數據。 HTH

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM