2016-08-19 5 views
2

У меня есть A стол, B стол 10 различных таблиц (1, 2, 3, .. 10). Я должен выбрать данные, соединяясь с одним или несколькими из них 10, A и B таблиц на основе ввода.Join только выбранные таблицы

Ex: Если вход только 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, как что то я должен присоединиться только к таблице людей, таблице заказов, таблице одежды и обувной таблице и получить информацию о лицах, которые заказали atlease одну из двух таблиц. лицо, имеющее только обувь или только колт, не требуется. результат будет похож на то, сколько одежды он заказал и сколько обуви он заказал.

Может кто-нибудь, пожалуйста, дать мне некоторое представление о том, как это сделать. Я работаю над Oracle db и использую SQL.

+3

Добавить некоторые данные таблицы образцов и ожидаемые результаты. – jarlh

+2

Если вопрос поднялся, это должно означать, что я делаю что-то неправильно, если не могу понять вопрос ... – sstan

+0

jarlh - это то, что я хочу или хочу, чтобы я добавил несколько подробностей. Я новичок в этом, если мой вопрос кажется немым, пожалуйста, простите меня. – bvk48

ответ

0

Я не думаю, что вы можете справиться с этим с помощью простого 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; 

Надеется, что это помогает ...

+0

Спасибо за ответ. Не могли бы вы предложить мне ответ с использованием подпрограмм – bvk48

+0

Да. Это помогает мне. Спасибо человек – bvk48

0

Это sql- синтаксиса сервера в отношении переменных, но, надеюсь, вы можете перевести это в переменные оракула. В любом случае трюк заключается в том, чтобы использовать ваши входные переменные в качестве условий для LEFT JOIN. Таким образом, если условие для вашей переменной ложно, оно просто не вернет строки из этой таблицы. Если true, он вернет совпадения. Если вы действительно хотите, чтобы это была INNER JOIN, а не LEFT JOIN, тогда просто поставьте оператор case в условие WHERE, чтобы сделать его истинным, если выполнено условие переменной.

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, так как другой ответ предполагает, что если вы идете по этому маршруту, есть больше соображений.

+0

Большое спасибо за ответ. У меня есть идея. – bvk48

0

Кажется, что ваши 10 разных таблиц на самом деле всего 10 различных категорий Продукты.

Можно ли гомогенизировать их все в один большой стол Products с дополнительным полем для ProductCategory (одежда, обувь, электроника и т. Д.)? Затем ваше задание сводится к простому WHERE на этом поле ProductCategory.

Эквивалент (хотя и менее эффективный) view может быть достигнут без изменения вашей схемы на UNION - все 10 таблиц вместе, на которых вы можете выполнить свое задание.

Я понимаю, что это прямо не отвечает на ваш вопрос, но это значительно упростит вашу проблему и нормализует вашу базу данных, тем самым устраняя необходимость в сложном решении (которое всегда является предпочтительным способом).

+0

Спасибо за информацию Jon. да, мы можем это сделать, но на самом деле эти 10 имеют разную категорию. Чтобы объяснить, я взял этот пример, поэтому не могу этого сделать в моем случае – bvk48

0

Я думаю, вы должны пойти для Труба выстроилась с динамическим sql.

например. вы создадите sql на лету, выполните его с execute immediate, возвратите resuls подряд за строкой. Посмотрите here.

Обратите внимание, что не существует общепринятого ответа, однако я думаю, что

Винсент Мальграт в

подход будет делать только штрафом.

 Смежные вопросы

  • Нет связанных вопросов^_^