sqlplus SELECT из выбранного результата - PullRequest
0 голосов
/ 07 сентября 2018

Я использую Oracle sqlplus и пытаюсь использовать результат, выбранный из приведенных ниже кодов, и снова выбрать столбец из таблицы_1

SELECT * 
FROM
(
SELECT Column_Name 
FROM All_Tab_columns 
WHERE Table_Name=UPPER('Table_1')
)
INTERSECT
(
SELECT Column_Name 
FROM All_Tab_columns 
WHERE Table_Name=UPPER('Table_2')
);

Как я могу выполнить что-то подобное:

SELECT <Columns_That_Intersected>
FROM Table_1;

Можно ли сохранить Columns_That_Intersected в переменной / функции / процедуре и использовать его снова для другого оператора выбора?

Ответы [ 3 ]

0 голосов
/ 07 сентября 2018

Просто чтобы получить имена столбцов, которые существуют как в таблице table1, так и в table2, вы можете использовать запрос ниже:

SELECT Column_Name
  FROM all_tab_columns t1
 WHERE table_name = 'Table1'
   AND EXISTS (SELECT 1
                 FROM all_tab_columns t2
                WHERE table_name = 'Table2'
                  AND t2.Column_Name = t1.Column_Name);

Затем, чтобы получить значения этих столбцов из таблицы 1, вы можете использовать следующую конструкцию PL / SQL:

DECLARE
v_sql_statement VARCHAR2(2000);
v_cols          VARCHAR2(2000);
BEGIN
 FOR cn IN (SELECT Column_Name
              FROM all_tab_columns t1
             WHERE table_name = 'Table1'
               AND EXISTS (SELECT 1
                             FROM all_tab_columns t2
                            WHERE table_name = 'Table2'
                              AND t2.Column_Name = t1.Column_Name))
 LOOP
    v_cols := v_cols || ', ' || cn.column_name;

 END LOOP;

 v_cols := ltrim(v_cols, ',');
 v_sql_statement := 'SELECT ' || v_cols || ' FROM Table1';
 EXECUTE IMMEDIATE v_sql_statement;

END; 
0 голосов
/ 07 сентября 2018

Да, это возможно. Просто сохраните агрегированный результат запроса в переменную подстановки . Примерно так:

create table items1 as 
select rownum id, 'me '||rownum name, 1 dummy
from xmlTable ('1 to 3');
create table items2 as select id, name from items1;

set verify off
col Columns_That_Intersected new_value Columns_That_Intersected noprint 

select listagg (column_name, ',') within group (order by null) Columns_That_Intersected
from (
    select column_name
    from All_Tab_Columns 
    where Table_Name=UPPER('items1')
    intersect
    select column_name
    from All_Tab_columns 
    where Table_Name=UPPER('items2')
);

prompt Columns_That_Intersected=&Columns_That_Intersected
select &Columns_That_Intersected 
from items1; 

Выход:

Columns_That_Intersected=ID,NAME

        ID NAME
---------- -------------------------------------------
         1 me 1
         2 me 2
         3 me 3

О команде col [umn]

0 голосов
/ 07 сентября 2018

Вы можете, например, работать с динамическим sql.

Результат ваших выборов может быть агрегирован в список с помощью функции listagg

SELECT listagg( Column_Name,',') WITHIN GROUP (ORDER BY 1) cols
FROM
(
  SELECT Column_Name 
  FROM All_Tab_columns 
  WHERE Table_Name=UPPER('tab1')      
  INTERSECT      
  SELECT Column_Name 
  FROM All_Tab_columns 
  WHERE Table_Name=UPPER('tab2')

);

В результате вы получите, например,. col1, col2, col3 с помощью этого списка вы можете создать курсор в блоке plsql, а затем перебрать его, чтобы распечатать нужную информацию.

declare
  v_cols    VARCHAR2(2000);
  v_select_string varchar(2000);
  csr                SYS_REFCURSOR;
  v1            VARCHAR2(2000);
BEGIN
  SELECT listagg( Column_Name,',') WITHIN GROUP (ORDER BY 1) cols
  into v_cols
  FROM
  (
    SELECT Column_Name 
    FROM All_Tab_columns 
    WHERE Table_Name=UPPER('tab1')    
    INTERSECT    
    SELECT Column_Name 
    FROM All_Tab_columns 
    WHERE Table_Name=UPPER('tab2')  
  );

  v_select_string   := 'SELECT ' || v_cols  ||
                       ' FROM tab1';

  OPEN csr FOR v_select_string;

  LOOP
    FETCH csr INTO v1;

    EXIT WHEN csr%NOTFOUND;         

    DBMS_OUTPUT.PUT_LINE( v1);
  END LOOP;

  CLOSE csr;
END P1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...