установить переменную в NULL, если вложенный запрос не возвращает результатов - PullRequest
1 голос
/ 13 мая 2011

Предположим, у вас есть следующий запрос. Если вложенный запрос возвращает NULL (0 результатов), хранимая процедура завершается с ошибкой, упомянутой ниже. Я обнаружил, что могу переписать код в альтернативном запросе ниже, но я хочу найти более простой синтаксис для его написания. У меня их около 10, а у некоторых есть несколько вложенных запросов. Есть ли более простой способ написать их? Я не специалист по SQL, поэтому я всегда ищу предложения! Благодаря.

Запрос (который иногда падает):

SET @sampleid = (
    SELECT 
        [sampleid]
    FROM [sample]
    WHERE [identifyingnumber] = @sample_identifyingnumber

Ошибка в запросе:

Subquery returned more than 1 value. This is not permitted when the subquery
follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

Альтернативный запрос, который никогда не падает:

IF 
(
    SELECT 
        COUNT([sampleid])
    FROM [sample]
    WHERE [identifyingnumber] = @sample_identifyingnumber
) = 0
BEGIN
SET @sampleid = NULL
END
ELSE
BEGIN
SET @sampleid =
(
    SELECT 
        DISTINCT [sampleid]
    FROM [sample]
    WHERE [identifyingnumber] = @sample_identifyingnumber
)
END

===============

Более сложный пример:

SET @testcodeid = (
    SELECT 
        [testcodeid]
    FROM [testcode]
    WHERE [testcode].[name] = (
        SELECT [test_code]
        FROM [ws_test_request]
        WHERE [client_id] = @clientid
          AND [sample_specimen_id] = @sample_identifyingnumber
    )
);  

Ответы [ 2 ]

2 голосов
/ 13 мая 2011

попробуй

SELECT @sampleid = [sampleid]
FROM [sample]
WHERE [identifyingnumber] = @sample_identifyingnumber
0 голосов
/ 13 мая 2011

Вы устанавливаете в NULL записи, для которых не существует записей в sample_table с идентифицирующим номером, равным sample_identifyingnumber:

UPDATE my_table
   SET sampleid = NULL
 WHERE NOT EXISTS
          (SELECT 'X'
             FROM sample_table
            WHERE identifyingnumber = sample_identifyingnumber);

Вы устанавливаете в MIN (DISTINCT sampleid) поле sampleid, для которого существуют записи записей sample_table, где identifying_number = sample_identifyingnumber:

UPDATE my_table
   SET sampleid =
          (SELECT MIN (DISTINCT sampleid)
             FROM sample_table
            WHERE identifyingnumber = sample_identifyingnumber)
 WHERE EXISTS
          (SELECT 'X'
             FROM sample_table
            WHERE identifying_number = sample_identifyingnumber);

Я написал MIN (DISTINCT ...) на случай, если мы найдем больше выборочных идентификаторов, соответствующих одному и тому же идентификационному номеру: в этом неудачном случае я возьму МИНИМУМ X (с X строго> 1) разных выборочных идентификаторов.

Мне нужно два обновления вместо одного.

...