【发布时间】: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子句中的隐式连接。