2013-05-16 131 views
0

我需要從甲骨文另一個表顯示一些領域,這裏是我的查詢使用WHERE子句中的子查詢的別名在Oracle中

SELECT 
ANGGARAN.SIMPEG_PEGAWAI.ID_PEGAWAI AS KODE, 
ANGGARAN.SIMPEG_PEGAWAI.NAMA, 
ANGGARAN.SIMPEG_PEGAWAI.NIP, 
ANGGARAN.SIMPEG_ESELON_JABATAN.JABATAN, 
ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.GOLONGAN, 
ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.PANGKAT, 
    (SELECT * 
      FROM (SELECT CONCAT(TO_CHAR(abs(sysdate - TO_DATE(TMT_JABATAN))/360,'9,999,999.9'),' TAHUN') 
       FROM SIMPEG_JABATAN where ID_PEGAWAI=KODE ORDER BY TMT_JABATAN desc) 
    WHERE ROWNUM = 1) AS MASA_KERJA 
FROM 
ANGGARAN.SIMPEG_PEGAWAI 
    INNER JOIN ANGGARAN.SIMPEG_ESELON_JABATAN 
     ON ANGGARAN.SIMPEG_PEGAWAI.ESELON_JABATAN = ANGGARAN.SIMPEG_ESELON_JABATAN.ID_ESELON_JABATAN 
    INNER JOIN ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT 
     ON ANGGARAN.SIMPEG_PEGAWAI.PANGKAT = ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.ID_GOLONGAN_PANGKAT 
WHERE 
    ANGGARAN.SIMPEG_PEGAWAI.ST_AKTIF = 1 AND 
    ANGGARAN.SIMPEG_PEGAWAI.ESELON2 <> 1 AND 
    ANGGARAN.SIMPEG_PEGAWAI.PANGKAT >= 12 AND 
    ANGGARAN.SIMPEG_ESELON_JABATAN.STATUS = 1 AND 
    ANGGARAN.SIMPEG_ESELON_JABATAN.ID_ESELON2=2 
ORDER BY 
ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.SORT DESC 

結果我得到

[Err] ORA-00904: "KODE": invalid identifier 

的KODE來自查詢ANGGARAN.SIMPEG_PEGAWAI.ID_PEGAWAI AS KODE,並用於此查詢

(SELECT * 
     FROM (SELECT CONCAT(TO_CHAR(abs(sysdate - TO_DATE(TMT_JABATAN))/360,'9,999,999.9'),' TAHUN') 
      FROM SIMPEG_JABATAN where ID_PEGAWAI=KODE ORDER BY TMT_JABATAN desc) 
WHERE ROWNUM = 1) AS MASA_KERJA 

我錯過了什麼?或者可能是在oracle數據庫的子查詢where子句中使用別名的問題?

回答

1

只能在一個級別的深度查詢中使用外部查詢中定義的標識符。你必須重新考慮你的策略。我的建議是從選擇列表中刪除子查詢,並將其置於FROM子句中。並添加另一個rownumber列如下:

(SELECT 
    ID_PEGAWAI, 
    CONCAT(TO_CHAR(abs(sysdate - TO_DATE(TMT_JABATAN))/360,'9,999,999.9'),' TAHUN') MASA_KERJA, 
    ROW_NUMBER() OVER (PARTITION BY ID_PEGAWAI ORDER BY TMT_JABATAN DESC) rownumber 
FROM SIMPEG_JABATAN) xxx 

並加入像:

ON ANGGARAN.SIMPEG_PEGAWAI = xxx.ID_PEGAWAI 

然後在WHERE子句中,你可以簡單地做:

WHERE 
    .... 
    AND xxx.rownumber = 1 

完整的查詢:

SELECT 
    ANGGARAN.SIMPEG_PEGAWAI.ID_PEGAWAI AS KODE, 
    ANGGARAN.SIMPEG_PEGAWAI.NAMA, 
    ANGGARAN.SIMPEG_PEGAWAI.NIP, 
    ANGGARAN.SIMPEG_ESELON_JABATAN.JABATAN, 
    ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.GOLONGAN, 
    ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.PANGKAT 
FROM 
    ANGGARAN.SIMPEG_PEGAWAI 
    INNER JOIN ANGGARAN.SIMPEG_ESELON_JABATAN 
     ON ANGGARAN.SIMPEG_PEGAWAI.ESELON_JABATAN = ANGGARAN.SIMPEG_ESELON_JABATAN.ID_ESELON_JABATAN 
    INNER JOIN ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT 
     ON ANGGARAN.SIMPEG_PEGAWAI.PANGKAT = ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.ID_GOLONGAN_PANGKAT 
    INNER JOIN (
     SELECT 
     ID_PEGAWAI, 
     CONCAT(TO_CHAR(abs(sysdate - TO_DATE(TMT_JABATAN))/360,'9,999,999.9'),' TAHUN') MASA_KERJA, 
     ROW_NUMBER() OVER (PARTITION BY ID_PEGAWAI ORDER BY TMT_JABATAN DESC) rownumber 
     FROM SIMPEG_JABATAN 
    ) xxx 
     ON ANGGARAN.SIMPEG_PEGAWAI.ID_PEGAWAI = xxx.ID_PEGAWAI 
WHERE 
    ANGGARAN.SIMPEG_PEGAWAI.ST_AKTIF = 1 AND 
    ANGGARAN.SIMPEG_PEGAWAI.ESELON2 <> 1 AND 
    ANGGARAN.SIMPEG_PEGAWAI.PANGKAT >= 12 AND 
    ANGGARAN.SIMPEG_ESELON_JABATAN.STATUS = 1 AND 
    ANGGARAN.SIMPEG_ESELON_JABATAN.ID_ESELON2=2 AND 
    xxx.rownumber = 1 
ORDER BY ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.SORT DESC 
+0

這裏是返回結果[Err] ORA-00904:「XXX」。「ROWNUMBER」:無效標識符 –

+0

不明白你試圖展示,你想展示怎麼可能是用上面的查詢完成:) –

+0

更新了我的答案。在這裏編寫SQL代碼非常困難,但我認爲我的意思很清楚。 – lunr

0

Oracle不支持WHERE子句中的列別名(或類似的情況)。您必須重新命名該列(按其原始名稱)。

select dummy as kode from dual where kode = 'X' 

> ORA-00904: "KODE": invalid identifier 
+0

我曾嘗試使用原始的c olumns的名字,但是沒有用過 –

+1

但是這樣會起作用:'select * from(選擇dummy作爲kode來自dual)a其中kode ='X'' – ZZa

+0

@ZZa:是的,將別名的引用推送給消費者它被聲明的視圖使其可見(否則,它們根本就沒有任何意義)。 – Thilo

0

您需要分配在以下級別的別名使用它在查詢(我沒有檢查你查詢的語法性和可操作性,只是改變了這是必須回答你的問題的部分):

SELECT 
TMP.KODE, 
TMP.NAMA, 
TMP.NIP, 
ANGGARAN.SIMPEG_ESELON_JABATAN.JABATAN, 
ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.GOLONGAN, 
ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.PANGKAT, 
    (SELECT * 
      FROM (SELECT CONCAT(TO_CHAR(abs(sysdate - TO_DATE(TMT_JABATAN))/360,'9,999,999.9'),' TAHUN') 
       FROM SIMPEG_JABATAN where ID_PEGAWAI=TMP.KODE ORDER BY TMT_JABATAN desc) 
    WHERE ROWNUM = 1) AS MASA_KERJA 
FROM 
(SELECT ANGGARAN.SIMPEG_PEGAWAI.ID_PEGAWAI AS KODE, ANGGARAN.SIMPEG_PEGAWAI.* FROM ANGGARAN.SIMPEG_PEGAWAI) TMP 
    INNER JOIN ANGGARAN.SIMPEG_ESELON_JABATAN 
     ON TMP.ESELON_JABATAN = ANGGARAN.SIMPEG_ESELON_JABATAN.ID_ESELON_JABATAN 
    INNER JOIN ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT 
     ON TMP.PANGKAT = ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.ID_GOLONGAN_PANGKAT 
WHERE 
    TMP.ST_AKTIF = 1 AND 
    TMP.ESELON2 <> 1 AND 
    TMP.PANGKAT >= 12 AND 
    ANGGARAN.SIMPEG_ESELON_JABATAN.STATUS = 1 AND 
    ANGGARAN.SIMPEG_ESELON_JABATAN.ID_ESELON2=2 
ORDER BY 
ANGGARAN.SIMPEG_KODE_GOLONGAN_PANGKAT.SORT DESC 
+0

我已經試過你的答案,但結果出現[Err] ORA-00933:SQL命令未正確結束 –

+0

再次嘗試,不確定是否可以使用點分配別名,將它們除掉。 – ZZa

+0

不同的錯誤代碼顯示[錯誤] ORA-00904:「KODE」:無效的標識符 –