[英]Join only selected tables
我有A
表, B
表10不同的表( 1
, 2
, 3
,...... 10
)。 我必須通過基於輸入連接那10個, A
和B
表中的任何一個/多個來選擇數據。
例如:如果輸入是僅2,5,8,10我不得不加入A
, B
, 2
, 5
, 8
,和10
表和檢索數據。 如果輸入僅是第1個表和第7
個表,則我必須聯接A
, B
, 1
和7
表並檢索數據。
----樣品-----
suppose A is a person table with p_id, p_name, order_id,.......
B is an order table with Order_id,.........
each 1-10 tables are shopping items like clothes, shoes, electronics,...etc
現在,我想提取僅訂購具有其他限制的衣服和鞋子的人員詳細信息,例如在這些日期或年齡之內應為20歲,那么我只需要加入人員表,訂購表,服裝表和鞋類表並檢索詳細信息關於訂購至少兩張桌子之一的人的信息。 不需要只有鞋或只有衣服的人。 結果將類似於他訂購了多少衣服和訂購了多少鞋子。
任何人都可以給我一些想法怎么做。 我正在使用oracle db並使用SQL。
我認為您無法使用普通SQL處理此問題。 看來您需要使用動態SQL。 具有一個存儲過程,該存儲過程具有您需要連接的表的參數,然后根據調用該過程的方式來構建查詢。 使用立即執行運行查詢...在此處了解更多信息: https : //docs.oracle.com/cloud/latest/db112/LNPLS/dynamic.htm#LNPLS011
更新:這是偽plsql的示例,因為我沒有您的實際數據。 這只是給您一個有關如何進行的想法-我無法使用給定的信息和您的設置為您編寫實際的代碼:
DECLARE
table1 VARCHAR2 (100) := 'Table1';
table2 VARCHAR2 (100) := '';
table3 VARCHAR2 (100) := 'Table2';
...
table10 VARCHAR2 (100) := 'Table10';
query VARCHAR2 (4000) := '';
BEGIN
--create the core join between A and B
query := query || 'select A.p_id, A.p_name, B.order_id from A, B where A.order_id = B.order_id ';
IF (table1 != '') THEN query := query || ' and a.id = table1.id ';
--if statements for the rest of your tables and add the join condition for each table to the query string
...
EXECUTE IMMEDIATE query; --run the query... depends on what you want to do with the returned result you can use RETURN INTO or BULK COLLECT INTO...
EXCEPTION
WHEN OTHERS
THEN
DBMS_OUTPUT.put_line (SQLERRM);
END;
希望這可以幫助...
就變量而言,這是sql-server語法,但希望您可以將其轉換為oracle變量。 無論如何,訣竅是使用輸入變量作為LEFT JOIN上的條件。 這樣,如果變量的條件為false,它將不會從該表返回行。 如果為true,則將返回匹配項。 如果您真的希望它是一個INNER JOIN而不是LEFT JOIN,則只需在您的WHERE條件中放置一個case語句,以在滿足可變條件時使其為true。
DECLARE @IncludeT1 BIT, @IncludeT2 BIT
SELECT *
FROM
TableA a
INNER JOIN TableB B
ON a.somecol = b.somecol
LEFT JOIN Table1 t1
ON a.somecol = t1.somecol
AND @IncludeT1 = 1
LEFT JOIN Table2 t2
ON b.somecol = t2.solmcol
AND @IncludeT1 = 1
WHERE
(CASE WHEN (@IncludeT1 = 1 and t1.someid IS NOT NULL) OR @IncludeT1 = 0 THEN 1 ELSE 0 END) = 1
AND (CASE WHEN (@IncludeT2 = 1 and t2.someid IS NOT NULL) OR @IncludeT2 = 0 THEN 1 ELSE 0 END) = 1
您還可以通過動態SQL來完成此操作,因為其他答案表明,如果您選擇這種方法,則還有更多注意事項。
看來您的10個不同表實際上只是10個不同類別的產品 。
是否可以將它們全部同質化為一個大的Products
表,並為ProductCategory
(衣服,鞋子,電子產品等)增加一個字段? 然后,您的分配將簡化為此ProductCategory
字段上的WHERE
。
無需通過UNION
修改架構即可實現等效(盡管效率較低) view
,將所有10個表放在一起,即可在其上繪制分配。
我意識到這並不能直接回答您的問題,但是可以大大簡化您的問題並使數據庫規范化,從而消除了對復雜解決方案的需求(這始終是首選方法)。
我認為您應該使用動態sql進行管道內聯函數 。
例如,您將即時創建sql,使用execute immediate
,逐行返回resuls。 在這里看看。
請注意,沒有可接受的答案,但是我認為
文森特·馬爾格拉特(Vincent Malgrat)
方法就可以了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.