在Oracle中的Where子句子查询中使用别名

时间:2013-05-16 07:53:02

标签: oracle10g alias

我需要在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子句中的别名?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

Oracle不支持WHERE子句中的列别名(或类似此处的类似情况)。您必须再次命名该列(按其原始名称)。

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

 >  ORA-00904: "KODE": invalid identifier

答案 2 :(得分: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