[英]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;
這樣,您將看到第一步所需的所有行。 在第二步中,您應該能夠使用NVL
和CASE
來獲取所需的數據。 HTH
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.