【问题标题】:Oracle Statement repeating itself 9 times!! I need suggestionsOracle 声明重复了 9 次!!我需要建议
【发布时间】:2014-01-15 17:18:07
【问题描述】:

我得到了一个 oracle 数据库的脚本,它一定有问题,代码运行正常,但结果是,对于结果的每一行,还有另外 8 行具有相同的结果。不是只显示一行,而是显示 9

下面的脚本可能有什么问题?

SELECT P.IDPESSOA AS CodigoCompanhia,
       E.NOMEEMPRESA AS NomeCompanhia,
       L.LACDEBCRE AS TipoOperacao,
       L.TRGDTINCLUSAO AS DataLancamento,
       P.PLNDATDIA AS DataContabilizacao,
       L.PLACONTA AS ContaContabil,
       C.PLANOME AS DescricaoContaContabil,
       C.PLANATUREZA AS NaturezaContaContabil,
       L.LACVALOR AS ValorContabil,
       M.MOESIGLA AS Moeda,
       L.LACHIST1||' '||L.LACHIST2||' '||L.LACHIST3||' '||L.LACHIST4||' '||L.LACHIST5 AS HistoricoLancamento,
       C.PLAGRUPO AS ClasseConta,
       L.IDUSUARIOINCLUSAO AS PreparerID,
       NVL(PE.NOME, U.NOMEUSUARIO) AS NomeCompletoFuncionario,
       CG.DESCRICAO AS CargoFuncionario,
       TO_CHAR(PC.PERNOME)||'/'||TO_CHAR(P.PEREXERCICIO) AS PeriodoContabil,
       TO_CHAR(P.PLNPLANIL)||'-'||TO_CHAR(L.LACNUMLAN)||'-'||LACDEBCRE AS NumeroDocumento,
       C.PLASUBGR3 AS ContasCompensacaoTransitorias,  
       P.PLNPLANIL, L.LACNUMLAN, P.PLNCODIGO
FROM PLANILHA P, LANCAMENTO L, EMPRESAPROP E, PLANOCONTA C, PERIODO PC,
     PARAMGLOBAL PG, MOEDA M, USUARIOSISTEMA U, PESSOA PE, FUNCIONARIO F, CARGO CG
WHERE P.PLNCODIGO = L.PLNCODIGO
  AND P.PLNDATDIA >= TO_DATE('01/01/2013','DD/MM/YYYY')
  AND P.PLNDATDIA <= TO_DATE('30/04/2013','DD/MM/YYYY')
  AND P.PEREXERCICIO = PC.PEREXERCICIO
  AND P.PERNUMERO = PC.PERNUMERO
  AND P.IDPESSOA = E.IDPESSOA
  AND P.IDPESSOA = PG.IDPESSOA
  AND PG.MOEDACORRENTE = M.MOECODIGO
  AND L.PLANO = C.PLANO
  AND L.PLACONTA = C.PLACONTA
  AND L.IDUSUARIOINCLUSAO = U.IDUSUARIO
  AND U.IDUSUARIO = PE.IDPESSOA(+)
  AND PE.IDPESSOA = F.IDPESSOA(+)
  AND F.IDCARGO = CG.IDCARGO(+)
  AND P.IDPESSOA = 1
ORDER BY P.IDPESSOA, P.PLNDATDIA, P.PLNPLANIL, L.LACNUMLAN;

谢谢

【问题讨论】:

  • 您加入了许多表。如果您在另一个表中的一条记录有多个数据,这是正常行为。
  • 您确认您的联接是完整且正确的吗?听起来这可能是某种笛卡尔结果。
  • 作为快捷方式,请确保在 Join 中使用每个表的 PK(Primary Key)。如果即使在重复弹出之后,您也必须确定缺少的连接条件。否则请执行DISTINCT
  • 表示你要加入的表之间存在一个或多个1,* 关系。您可以通过观察哪个表的哪个字段重复来识别哪个。
  • 您应该开始使用显式的JOIN 语法而不是where 子句中的隐式连接。

标签: sql database oracle date


【解决方案1】:

将 select 中引用的每个表的主键添加到输出列列表中。这看起来很像其中一张桌子上的 1:n 关系;您可以通过检查每组“相等”的 9 行中哪些 PK 不同来识别它。

【讨论】:

    【解决方案2】:

    您也可以在“order by”子句之前使用“group by”

    【讨论】:

    • 不是在 oracle 中你不能。在 select 子句中不是没有聚合。
    • @DanBracuk - yes you can,只要您包含 所有 选定的列。它的行为类似于distinct,但更痛苦。特别是在这里,因为不能使用列别名;所有to_char() 和连接必须完全重复。您基本上必须重复整个select 部分(减去所有as &lt;alias&gt; 部分)。不知道为什么有人会想要这样做,但这是允许的。 (而这个,或distinct,通常只是掩盖了实际问题)。
    猜你喜欢
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 2020-03-16
    • 2017-09-28
    • 1970-01-01
    相关资源
    最近更新 更多