我有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。
答案 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。
请注意,没有接受的答案,但我认为
文森特·马格拉特
方法会做得很好。