0

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

4

3 回答 3

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
于 2013-05-16T08:06:49.210 回答
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
于 2013-05-16T07:58:41.180 回答
0

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

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

 >  ORA-00904: "KODE": invalid identifier
于 2013-05-16T07:55:38.767 回答