1

我正在运行以下查询并检查它是否返回任何结果,如果没有,我需要在我的 sp.xml 中实现一些逻辑。我从我的 sp 中给出了下面的几个代码块。

select * from temp
where (select * table1 where Id='4728')=0

如果 table1 没有任何记录,它不应该返回任何结果,我需要知道我是否正确检查它。

INSERT INTO #companies
    SELECT DISTINCT c.Company_Id
    FROM COMPANY C
        INNER JOIN Request_Summary rs ON c.Company_ID=rs.Company_ID
        WHERE
            rs.IsMember_Ind <> 0            
            AND (SELECT COUNT(*) FROM Monitor_Request mr WHERE mr.Company_ID=c.Company_ID)< 5
                       -- I am checking it here
            AND EXISTS(SELECT COUNT(*) FROM Monitor_Request mr2 WHERE mr2.Company_ID=c.Company_ID)
            AND NOT EXISTS(
                SELECT * FROM TaskAction ta WHERE 
                ta.FirstActionTypeId = @firstActionTypeId and 
                ta.TaskTypeId = @taskTypeId and 
                ta.NextActionTypeId is not null and
                ta.EntityId = c.Company_ID and
                ta.EntityTypeId = 1)
4

4 回答 4

3

如果 table1 没有任何记录,则不应返回任何结果

由于您处于存储过程中,您可能只想这样做

IF Exists(select * table1 where Id='4728')
BEGIN 
     Select...

END 
于 2012-07-03T15:33:49.317 回答
2

改用WHERE EXISTS

SELECT * 
FROM temp 
WHERE EXISTS
(
    SELECT * 
    FROM table1 
    WHERE Id='4728'
)
于 2012-07-03T15:28:42.607 回答
2

这是另一个解决方案:

IF (SELECT COUNT(1) FROM table1 WHERE Id='4728') = 0
BEGIN
    SELECT * FROM temp
END

还有另一个解决方案,正如 Aaron 在评论中提出的那样:

IF EXISTS(SELECT 1 FROM table1 WHERE Id='4728')
BEGIN 
     SELECT * FROM temp
END 
于 2012-07-03T15:34:05.097 回答
0

嗯,我想我会将该查询重组为以下内容:

INSERT INTO #companies
SELECT c.company_Id  -- presumes that company_Id is DISTINCT initially
FROM Company c
WHERE EXISTS (SELECT '1'
              FROM Request_Summary s
              WHERE s.company_Id = c.company_Id
              AND s.isMember_Ind <> 0)
AND EXISTS (SELECT '1'
            FROM Monitor_Request m
            WHERE m.company_Id = c.company_Id
            GROUP BY m.company_Id
            HAVING COUNT(*) < 5)
AND NOT EXISTS (SELECT '1'
                FROM TaskAction t
                WHERE ta.FirstActionTypeId = @firstActionTypeId 
                AND t.TaskTypeId = @taskTypeId 
                AND t.NextActionTypeId IS NOT NULL 
                AND t.EntityId = c.Company_ID 
                AND t.EntityTypeId = 1)

永远不要打扰一个SELECT COUNT(*)内部WHERE EXISTS子句,因为优化器可能会计算所有行(即使我们只关心一个)。如果 aJOIN为您提供了不止一行,但您只是在检查是否存在(即,您不需要其中的任何数据),请使用EXISTS子句。

我实际上对您的整个 SP 感到好奇,而不仅仅是这个查询——尤其是当您插入会话/临时表时。这是应该变成CTE的东西吗?

于 2012-07-03T17:21:05.953 回答