仅加入选定的表格

时间:2016-08-19 14:19:29

标签: sql oracle jointable

我有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。

4 个答案:

答案 0 :(得分:0)

我认为你不能用纯SQL来处理这个问题。看起来您需要使用动态SQL。有一个存储过程,其中包含您需要加入的表的参数,然后根据您调用该过程的方式构建查询。使用execute immediate运行查询...在此处阅读更多内容: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;

希望这会有所帮助......

答案 1 :(得分:0)

这是变量的sql-server语法,但希望你可以将其转换为oracle变量。无论如何,诀窍是使用输入变量作为LEFT JOIN的条件。这样,如果您的变量的条件为false,它就不会从该表返回行。如果为true,则返回匹配。如果你真的希望它是INNER JOIN而不是LEFT JOIN,那么只需在WHERE条件中放置一个case语句,以便在满足变量条件时使其成立。

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来实现,因为另一个答案表明如果您走这条路线会有更多的考虑因素。

答案 2 :(得分:0)

看来你的10个不同的表实际上只是10个不同类别的产品

是否可以将它们全部均匀化为一个大的Products表格,并附加ProductCategory字段(衣服,鞋子,电子产品等)?然后,您的分配将在此WHERE字段中简化为ProductCategory

可以实现等效(尽管效率较低)view而无需通过UNION修改架构 - 将所有10个表组合在一起,您可以在其上绘制作业。

我意识到这并没有直接回答你的问题,但这会大大简化你的问题并规范你的数据库,从而消除了对复杂解决方案的需求(这始终是首选方式)。

答案 3 :(得分:0)

我认为你应该选择带有动态sql的管道功能

e.g。你将动态创建sql,用execute immediate执行它,逐行返回结果。看看here

请注意,没有接受的答案,但我认为

  文森特·马格拉特

方法会做得很好。