SQL Server: строка, существующая в одном запросе, отсутствующем в другом

Хорошо, таким образом, я думаю, что должен неправильно понимать что-то о SQL-запросах. Это - довольно многословный вопрос, поэтому благодарит занять время для чтения его (моя проблема является правильной в конце, все остальное - просто контекст).

Я пишу систему учета, которая работает над принципалом двойной бухгалтерии - деньги всегда перемещаются между учетными записями, транзакция равняется 2 или больше TransactionParts строки, постепенно уменьшающие одну учетную запись и увеличивающие другого.

Некоторые TransactionParts строки могут быть отмечены как налог, связанный так, чтобы система могла представить отчет общих продаж/покупок VAT и т.д., таким образом, возможно, что единственная Транзакция может иметь два TransactionParts ссылка на ту же Учетную запись - один VAT, связанный, и другой нет. Для упрощения презентации до пользователя у меня есть представление для объединения нескольких строк для той же учетной записи и транзакции:

create view Accounting.CondensedEntryView as
select p.[Transaction], p.Account, sum(p.Amount) as Amount
    from Accounting.TransactionParts p 
    group by p.[Transaction], p.Account

У меня затем есть представление для вычисления под управлением итоговой колонки, следующим образом:

create view Accounting.TransactionBalanceView as
with cte as
(
    select ROW_NUMBER() over (order by t.[Date]) AS RowNumber, 
                         t.ID as [Transaction], p.Amount, p.Account
        from Accounting.Transactions t
            inner join Accounting.CondensedEntryView p on p.[Transaction]=t.ID
)
select b.RowNumber, b.[Transaction], a.Account, 
                coalesce(sum(a.Amount), 0) as Balance
    from cte a, cte b
    where a.RowNumber <= b.RowNumber AND a.Account=b.Account
    group by b.RowNumber, b.[Transaction], a.Account

По причинам я еще не удался, определенная транзакция (ID=30) не появляется на выписке по счету для пользователя. Я подтвердил это путем выполнения

select * from Accounting.TransactionBalanceView where [Transaction]=30

Это дало мне следующий результат:

RowNumber            Transaction Account Balance
-------------------- ----------- ------- ---------------------
72                   30          23      143.80

Как я сказал прежде, должны быть по крайней мере два TransactionParts для каждой Транзакции, таким образом, один из них не представляется, по моему мнению. Я предположил, что должна быть проблема со способом, которым я записал свое представление и выполнил запрос, чтобы видеть, существует ли что-либо еще пропавшие без вести:

select [Transaction], count(*) 
    from Accounting.TransactionBalanceView 
    group by [Transaction] 
    having count(*) < 2

Этот запрос не возвращает результатов - даже для Транзакции 30! Думая я должен быть идиотом, я выполняю следующий запрос:

select [Transaction] 
    from Accounting.TransactionBalanceView 
    where [Transaction]=30

Это возвращает две строки! Так select * возвраты только одна строка и select [Transaction] возвраты оба. После большого царапания головы и повторного выполнения последних двух запросов, я пришел к заключению, что не имею ни малейшего представления, что происходит. Какие-либо идеи?

Большое спасибо, если Вы придерживались меня настолько далеко!

Править:

Вот планы выполнения:

выберите *
выберите [Транзакция]

1 000 строк каждый, следовательно находя где-то в другом месте для хостинга.

Редактирование 2:

Для полноты вот таблицы, которые я использовал:

create table Accounting.Accounts
(
ID              smallint        identity primary key,
[Name]          varchar(50)     not null
    constraint UQ_AccountName unique,
[Type]          tinyint         not null
    constraint FK_AccountType foreign key references Accounting.AccountTypes
);

create table Accounting.Transactions
(
ID              int             identity primary key,
[Date]          date            not null default getdate(),
[Description]   varchar(50)     not null,
Reference       varchar(20)     not null default '',
Memo            varchar(1000)   not null
);

create table Accounting.TransactionParts
(
ID              int             identity primary key,
[Transaction]   int             not null
    constraint FK_TransactionPart foreign key references Accounting.Transactions,
Account         smallint        not null
    constraint FK_TransactionAccount foreign key references Accounting.Accounts,
Amount          money           not null,
VatRelated      bit             not null default 0
);

5
задан gordonmleigh 29 July 2010 в 21:50
поделиться