1

次のクエリを実行して、結果が返されるかどうかを確認しています。返されない場合は、spにロジックを実装する必要があります。私は私の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

そして、コメントでアーロンによって提案された、さらに別の解決策:

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(*)にすべての行をカウントするため、句の内側を気にしないでください(1つだけを気にする場合でも)。aが複数の行を提供しているが、存在をチェックしているだけの場合(つまり、そこからのデータは必要ない場合)、句を使用します。WHERE EXISTSJOINEXISTS

私は実際、このクエリだけでなく、特にセッション/一時テーブルに挿入しているときに、SP全体に興味がありました。これはCTEに変えるべきものですか?

于 2012-07-03T17:21:05.953 に答える