В чем разница между двумя операторами SQL? - PullRequest
0 голосов
/ 20 мая 2009

Добрый день

Все, что мы пытаемся сделать, это внутри триггера убедиться, что пользователь не вводит две платы, в названии которых есть «один». Эти сборы должны быть обработаны индивидуально.

По какой-то причине кажется, что верхняя часть sql перестала работать две недели назад. Чтобы обойти это, я перекодировал это вторым способом и получил правильные результаты. Что меня смущает, так это почему первая часть казалась работавшей в течение последних нескольких лет, а сейчас - нет?

SELECT  @AloneRecordCount = count(*) 

FROM  inserted i 
      INNER JOIN deleted d on i.id = d.id 

WHERE  i.StatusID = 32 
      AND d.StatusID <> 32 
      AND i.id IN  
      (SELECT settlementid FROM vwFundingDisbursement fd
      WHERE fd.DisbTypeName LIKE  '%Alone'
      AND fd.PaymentMethodID = 0)


SELECT  @AloneRecordCount = count(i.id) 

FROM    inserted i INNER JOIN
        deleted d on i.id = d.id
        JOIN vwFundingDisbursement fd on i.id = fd.settlementid

WHERE   i.StatusID = 32 
        AND d.StatusID <> 32  
        AND fd.DisbTypeName like '%Alone'
        AND fd.PaymentMethodID = 0

это на SQL Server 2005
ошибки нет, вместо этого верхний оператор вернет только 1 или ноль
в то время как нижний оператор возвратит фактическое найденное число.

Ответы [ 4 ]

4 голосов
/ 20 мая 2009

Есть ли у вас нулевое значение vwFundingDisbursement.settlementid? Это появилось недавно?

1 голос
/ 20 мая 2009

Схема (или, по крайней мере, как создается представление) может помочь, но вот предположение ...

Если вы ищете несколько строк в vwFundingDisbursement со значением «Alone» в имени типа распределения, то JOIN будет возвращать несколько строк, когда ваша исходная таблица (INSERTED) объединяется с несколькими строками в представлении. Однако если вы используете IN, SQL не волнует, вернет ли он несколько совпадений, он даст вам только одну строку.

Как пример:

CREATE TABLE dbo.Test_In_vs_Join1
(
     my_id     INT     NOT NULL
)

CREATE TABLE dbo.Test_In_vs_Join2
(
     my_id     INT     NOT NULL
)

INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (1)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (2)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (3)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (4)
INSERT INTO dbo.Test_In_vs_Join1 (my_id) VALUES (5)

INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (1)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (1)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (2)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (3)
INSERT INTO dbo.Test_In_vs_Join2 (my_id) VALUES (3)

SELECT
     T1.my_id,
     COUNT(*)
FROM
     dbo.Test_In_vs_Join1 T1
INNER JOIN dbo.Test_In_vs_Join2 T2 ON
     T2.my_id = T1.my_id
GROUP BY
    T1.my_id

SELECT
     T1.my_id,
     COUNT(*)
FROM
     dbo.Test_In_vs_Join1 T1
WHERE
    T1.my_id IN (SELECT T2.my_id FROM dbo.Test_In_vs_Join2 T2)
GROUP BY
    T1.my_id

В примечании, захоронение столбца внутри другого столбца, как это, является нарушением нормализованной формы и просто вызывает проблемы. Выполнение такого рода бизнес-логики в триггере также является опасным путем, как вы выясните.

0 голосов
/ 20 мая 2009

Я предполагаю, что этот MSSQL (?) Обрабатывает оператор UPDATE, поскольку вы объединяете обе вставленные / удаленные таблицы?

В какой таблице находится этот триггер?

0 голосов
/ 20 мая 2009

Количество (*)
кол (i.id)

будет возвращать различные значения на основе значений NULL

В SQL, в чем разница между count (*) и count ('x')?

...