Использование Table Cast - PullRequest
       15

Использование Table Cast

1 голос
/ 07 марта 2011

Можете ли вы использовать что-то на линии

Select * from table(cast(select * from tab1 inner join tab2)) inner join tab3

Примите во внимание, что то, что находится внутри таблицы (cast ()), является чем-то намного более сложным, чем простой выбор, включающий блок, например, с test, как (select) select * ... etc.

Мне нужен простой способ сделать это, желательно без временной таблицы.

Спасибо.

База данных: Oracle 10g

LE:

У меня есть что-то вроде

Select a.dummy1, a.dummy2, wm_concat(t2.dummy3)
    from table1 a, 
    (with str as 
        (Select '1,2,3,4' from dual) 
     Select a.dummy1, t.dummy3 
     from table1 a 
       inner join 
          (Select regexp_substr (str, '[^,]+', 1, rownum) split  
              from str
              connect by level <= length (regexp_replace (str, '[^,]+'))  + 1) t 
       on instr(a.dummy2, t.split) > 0) t2
where a.dummy1='xyz'
group by a.dummy1, a.dummy2

Основная идея заключается в том, что столбец t2.dummy3 содержит CSV. Вот почему я выбрал «1,2,3,4» из двойного. Мне нужно найти все строки, которые содержат хотя бы одно из значений из стр.

Использование любого вида цикла исключено, поскольку в дальнейшем мне нужно интегрировать его в более крупный запрос, используемый для отчета в SSRS, и таблицы, необходимые для этого, довольно большие (> 1 млн строк)

Ответы [ 2 ]

4 голосов
/ 07 марта 2011

CAST кажутся здесь совершенно неактуальными.Вы используете CAST, чтобы изменить воспринимаемый тип данных выражения.Здесь вы передаете ему набор результатов, а не выражение, и вы не говорите, к какому типу данных приводиться.

Вы сможете просто удалить вызовы TABLE и CAST и сделать что-то вроде:

SELECT * FROM (SELECT * FROM tab1 INNER JOIN tab2 ON ...) INNER JOIN tab3 ON ...

например,

SELECT * FROM
  (SELECT d1.dummy FROM dual d1 INNER JOIN dual d2 ON d1.dummy=d2.dummy) d12
   INNER JOIN dual d3 ON d12.dummy = d3.dummy

Здесь также должен работать факторинг подзапроса.

WITH x AS (SELECT * FROM DUAL)
SELECT * FROM
 (SELECT d1.dummy FROM x d1 INNER JOIN x d2 ON d1.dummy=d2.dummy) d12
 INNER JOIN dual d3 ON d12.dummy = d3.dummy;

Если у вас возникли трудности с получениемчтобы это работало, попробуйте добавить в свой вопрос более подробную информацию о том, что именно вы пробовали и какую ошибку вы получаете.

0 голосов
/ 08 марта 2011

Да ... я нашел ответ ... я был слишком SQL n00b, чтобы увидеть его, как он был прямо передо мной ...

Я просто взял оператор with вне запроса, и он сработал.

Большое спасибо за вашу помощь, именно ваш ответ привел меня к пониманию моей ошибки: D

Что-то вроде:

with str as 
        (Select '1,2,3,4' from dual)
Select a.dummy1, a.dummy2, wm_concat(t2.dummy3)
    from table1 a, 
    ( 
     Select a.dummy1, t.dummy3 
     from table1 a 
       inner join 
          (Select regexp_substr (str, '[^,]+', 1, rownum) split  
              from str
              connect by level <= length (regexp_replace (str, '[^,]+'))  + 1) t 
       on instr(a.dummy2, t.split) > 0) t2
where a.dummy1='xyz'
group by a.dummy1, a.dummy2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...