簡體   English   中英

僅聯接選定的表

[英]Join only selected tables

我有A表, B表10不同的表( 123 ,...... 10 )。 我必須通過基於輸入連接那10個, AB表中的任何一個/多個來選擇數據。

例如:如果輸入是僅2,5,8,10我不得不加入AB258 ,和10表和檢索數據。 如果輸入僅是第1個表和第7個表,則我必須聯接AB17表並檢索數據。

----樣品-----

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.

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