2016-03-23 4 views
0

У меня есть две коллекции чисел, одна из которых содержит n идентификаторов и одну, содержащую n значений. У меня также есть оператор select, содержащий n записей. Теперь я хочу присоединиться к ним вместе. Наглядно я пытался сделать что-то вроде этого: plsql - выбор Oracle с коллекциями

select * from 
(
    select t.stat      StatNr 
     , t.statNr      StatValue 
     , t.statName     statusName 
    from myTable t 
    where t.nr = 1234 
    order by ... 
) status, 
(
    select statId.v StatNr 
     , statVal.v StatValue 
    from 
    (
    select column_value v 
     , rownum  r 
    from table(numberCollection(98, 45, 66, 153, 103, 67, 27)) 
) statId, 
    (
    select column_value v 
     , rownum  r 
    from table(numberCollection( 1, 2, 1, 1, 3, 2, 2)) 
) statVal 
    where statId.r = statVal.r 
) statusNew 
where status.StatNr = statusNew.StatNr 
    and status.StatValue <> statusNew.StatValue 

Таким образом, оператор выбора без сбора чисел возвращает что-то вроде этого:

ID VALUE NAME   
98 1  some varchar 
153 1  some varchar 
66 1  some varchar 
27 3  some varchar 
67 4  some varchar 
45 1  some varchar 
103 1  some varchar 

И я хочу, чтобы добавить соответствующий идентификаторы и значения из моего коллекции, чтобы увидеть, отличается ли строка значений от моей таблицы значением строки из моей коллекции, а затем вернет имя.

Таким образом, результат выглядит следующим образом:

ID VALUE NAME   ID VALUE 
98 1  some varchar 98 1 
153 1  some varchar 153 1 
66 1  some varchar 66 1 
27 3  some varchar 27 2 
67 4  some varchar 67 2 
45 1  some varchar 45 2 
103 1  some varchar 103 3 

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

Так пункт, где в конце:

and status.StatValue <> statusNew.StatValue 

дал бы мне записи с измененными значениями, возвращая строку 4 - 7.

Теперь это выглядит немного уродливые, с моей точки зрения , Особенно предложение where, где я проверяю rownum. Во всяком случае, я относительно новичок в Oracle, есть ли недостаток этого или лучший способ добиться этого?

+1

Что вы подразумеваете под «присоединяйся к ним вместе». опубликовать исходную структуру данных и ожидаемый результат – Hawk

+0

Да, извините, я отредактировал мой пост – Characeae

ответ

0

Поскольку у вас есть соответствующая информация и ваши данные сравнения в двух независимых numberCollections, единственный способ синхронизировать эти два списка - по положению, которое здесь является ROWNUM.

Но вы можете сделать ваш SQL немного более удобным для чтения с помощью С-условие:

WITH comparedata AS (
SELECT statid.v StatNr, statval.v StatValue 
    FROM (
     select column_value v 
      , rownum  r 
     from table(numberCollection(98, 45, 66, 153, 103, 67, 27)) 
     ) statId, 
     (
     select column_value v 
      , rownum  r 
     from table(numberCollection( 1, 2, 1, 1, 3, 2, 2)) 
     ) statVal 
     where statId.r = statVal.r 
) 
select t.statNr 
    , t.statValue 
    , t.statName 
    from myTable t 
    JOIN comparedata d ON d.StatNr ON t.StatNr 
where t.nr = 1234 
    and status.StatValue <> statusNew.StatValue 
order by ... 

Здесь определяется именованный подзапрос под названием «comparedata» с результатом отображенных numberCollections. После этого вы используете «compareata» как любое представление или таблицу в предложении JOIN с вашей реальной таблицей.

Другие способы достижения вашей цели в конечном итоге получат больше кода (например, подпрограмма, которая разбивает строки формата «id = value; [id = value; ...]» в коллекцию с двумя идентификаторами столбцов и VALUE. Но если вам приходится чаще делать такие задания, вы можете подумать, стоит ли тратить время на создание такой функции.

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