两个sql语句有什么区别?

时间:2009-05-20 18:32:57

标签: sql sql-server-2005 triggers

美好的一天

我们所要做的就是在触发器内部,确保用户没有插入两个名单中“单独”的费用。这些费用需要单独处理。

出于某种原因,它出现在两周前sql quit工作的顶部。为了解决它,我以第二种方式重新编码并获得正确的结果。令我感到困惑的是,为什么第一部分似乎在过去的几年里工作了,现在却没有?

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上 没有错误,而top语句只返回1或0 而底部语句将返回找到的实际数字。

4 个答案:

答案 0 :(得分:4)

您是否获得了null vwFundingDisbursement.settlementid值?那最近出现了吗?

答案 1 :(得分:1)

架构(或至少如何创建视图)会有所帮助,但这是猜测......

如果要在vwFundingDisbursement中查找分配类型名称中值为“Alone”的多行,则当源表(INSERTED)连接到视图中的多行时,JOIN将返回多行。如果你使用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

在旁注中,将列嵌入另一列内部是违反规范化形式的,并且只是提出问题。在触发器中执行这种业务逻辑也是一条危险的道路,当你发现它时会失败。

答案 2 :(得分:0)

计数(*)
计数(i.id)

将根据NULL值返回不同的计数

In SQL, what’s the difference between count(*) and count('x')?

答案 3 :(得分:0)

我假设这个MSSQL(?)并且它正在处理UPDATE语句,因为你要加入插入/删除的表?

这个触发器在哪个表上?