2016-03-23 127 views
0

我有兩個數集合,一個包含n id和含有n個值之一。我也有一個包含n條記錄的select語句。現在,我想一起加入他們。 直覺我試圖做這樣的事情: PLSQL - 甲骨文選擇與集合

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 

所以,沒有數集的select語句返回是這樣的:

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和值從我集合來查看我的表中的值行是否與我的集合中的值行不同,然後返回名稱。

所以,結果是這樣的:

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 

其中前者ID和值是從表中,後者的ID和值列是從集合。

所以在where子句結尾:

and status.StatValue <> statusNew.StatValue 

會給我改變值的記錄,返回行4 - 7

現在,這看起來有點醜,從我的角度來看。尤其是我在哪裏檢查rownum。無論如何,我對Oracle相對來說比較陌生,有沒有這方面的缺點或更好的方法來實現這一目標?

+1

你是什麼意思?發佈原始數據結構和預期結果 – Hawk

+0

是的,對不起,我編輯了我的文章 – Characeae

回答

0

因爲您有兩個獨立的numberCollections中的匹配信息和比較數據,所以同步這兩個列表的唯一方法是按位置,這裏是ROWNUM。

但是你可以讓你的SQL多一點使用WITH子句可讀:

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的結果,一個名叫子查詢。 之後,您可以在JOIN子句中將「compareata」用作真實表格中的任何視圖或表格。其他方法來實現你的目標將最終在更多的代碼(像一個例程,將一個格式的字符串像「id = value; [id = value; ...]」分割成一個具有兩列ID的集合和VALUE 但是如果你必須更頻繁地做這樣的工作,你可能會考慮,如果值得花時間來創建這樣的功能