В настоящее время мы обновляемся до SQL Server 2014; У меня есть соединение, которое отлично работает в SQL Server 2008 R2, но возвращает дубликаты в SQL Server 2014. Проблема связана с предикатом AND L2.ACCOUNTING_PERIOD = RG.PERIOD_TO
, если я изменю его на все, кроме 4, я не получаю дубликатов. Запрос возвращает эти значения в отчетном периоде 4 дважды. Этот запрос получает сальдо счетов для всех предыдущих отчетных периодов, так что в этом случае она возвращает значения для отчетных периодов 0, 1, 2 и 3 правильно, но затем дублирует значение от периода 4.Слева от внешнего входа в SQL Server 2014
SELECT
A.ACCOUNT,
SUM(A.POSTED_TRAN_AMT),
SUM(A.POSTED_BASE_AMT),
SUM(A.POSTED_TOTAL_AMT)
FROM
PS_LEDGER A
LEFT JOIN PS_GL_ACCOUNT_TBL B
ON B.SETID = 'LTSHR'
LEFT OUTER JOIN PS_LEDGER L2
ON A.BUSINESS_UNIT = L2.BUSINESS_UNIT
AND A.LEDGER = L2.LEDGER
AND A.ACCOUNT = L2.ACCOUNT
AND A.ALTACCT = L2.ALTACCT
AND A.DEPTID = L2.DEPTID
AND A.PROJECT_ID = L2.PROJECT_ID
AND A.DATE_CODE = L2.DATE_CODE
AND A.BOOK_CODE = L2.BOOK_CODE
AND A.GL_ADJUST_TYPE = L2.GL_ADJUST_TYPE
AND A.CURRENCY_CD = L2.CURRENCY_CD
AND A.STATISTICS_CODE = L2.STATISTICS_CODE
AND A.FISCAL_YEAR = L2.FISCAL_YEAR
AND A.ACCOUNTING_PERIOD = L2.ACCOUNTING_PERIOD
AND L2.ACCOUNTING_PERIOD = RG.PERIOD_TO
WHERE
A.BUSINESS_UNIT = 'UK001'
AND A.LEDGER = 'LOCAL'
AND A.FISCAL_YEAR = 2015
AND ((A.ACCOUNTING_PERIOD BETWEEN 1 and 4
AND B.ACCOUNT_TYPE IN ('E','R'))
OR
(A.ACCOUNTING_PERIOD BETWEEN 0 and 4
AND B.ACCOUNT_TYPE IN ('A','L','Q')) )
AND A.STATISTICS_CODE = ' '
AND A.ACCOUNT = '21101'
AND A.CURRENCY_CD <> ' '
AND A.CURRENCY_CD = 'GBP'
AND B.SETID='LTSHR'
AND B.ACCOUNT=A.ACCOUNT
AND B.SETID = SETID
AND B.EFFDT=(SELECT MAX(EFFDT) FROM PS_GL_ACCOUNT_TBL WHERE SETID='LTSHR' AND WHERE ACCOUNT=B.ACCOUNT AND EFFDT<='2015-01-31 00:00:00.000')
GROUP BY A.ACCOUNT
ORDER BY A.ACCOUNT
Первое предположение о том, что данные отличаются в двух базах данных вы тестируете. –
И, к сожалению, догадка, что он останется, без каких-либо DDL и DML, чтобы мы воспроизвели сценарий ... – Jeroen
Обратите внимание, что, помещая предикаты равенства в предложение 'WHERE' для столбцов таблицы' B', вы эффективно конвертировали свой ' LEFT JOIN' этой таблицы во внутреннее соединение. Вероятно, это нормально, потому что условие соединения не полагается на левую таблицу вообще, так что это действительно кросс-соединение подмножества правой таблицы. –