2016-08-02 2 views
0

Я пытаюсь написать хранимую процедуру, и это включает в себя сопоставление списка строк в таблице со столбцом в другой таблице. Если даже одна строка текста в столбце неверна по сравнению с таблицей, процедура прерывается.SQL - найти строку соответствия и остановить, если не найден

enter image description here

+2

отправьте изображение как текст, некоторые примеры данных, ожидаемый результат .. Посмотрите здесь, как улучшить вопрос..https: //spaghettidba.com/2015/04/24/how-to-post- at-sql-question-on-a-public-forum/ – TheGameiswar

+0

Джей, должен ли CUSTID соответствовать TEMPID? Полагаю, что это должно произойти, но по этому поводу есть дискуссия. –

ответ

0

Используйте это простое правило:

IF EXISTS(SELECT * FROM TableToMatch T2 
      WHERE NOT EXISTS(SELECT * FROM ListTable T1 WHERE T1.Template=T2.Template)) 
    THROW; 

Если вы хотите быть более точным, возвращать сообщение:

IF EXISTS(SELECT * FROM TableToMatch T2 
      WHERE NOT EXISTS(SELECT * FROM ListTable T1 WHERE T1.Template=T2.Template)) 
    THROW 50000, 'Procedure is too crazy to finish', 0 

Если вы хотите symetric матч, вы можете использовать FULL OUTER JOIN:

IF EXISTS(
     SELECT * 
     FROM TableToMatch T1 
     FULL JOIN ListTable T2 ON T1.Template=T2.Template 
     WHERE T1.Template IS NULL OR T2.Template IS NULL) 
    THROW 50000, 'Procedure is too crazy to finish', 0 
+0

Что делать, если в ListTable нет элемента, который не существует в TableToMatch? –

+0

Теперь выполняется симметричное совпадение, но проблема все еще остается: что, если шаблоны соответствуют, но CUSTID не соответствует TEMPID? –

+0

Если я хочу обновить столбец в TableToMatch с помощью CUSTID в ListTable, сделаю ли я обновление после THROW? Спасибо – Jay

-1

Tryi выполнения этого запроса:

DECLARE @CountOfNonMatchRecords INT 
SELECT 
@CountOfNonMatchRecords = COUNT(T.Template) 
FROM <TableToMatch> T 
LEFT JOIN 
<ListTable> L ON L.Template = T.Template 
WHERE L.Template IS NULL 

IF @CountOfNonMatchRecords > 0 THEN 
BEGIN 
--Break your procedure 
END 
+0

Вы не сравниваете CUSTID с TEMPID. Что делать, если есть шаблоны с тем же именем, но с разными CUSTID и TEMPID? Кроме того, что, если в T есть элемент, который не существует в L? –

+0

@Lajos: Вопрос в том, что вопрос прост в том, что если какая-либо строка в таблице T недоступна в таблице L, то сделайте перерыв. Вопрос никогда не упоминал никаких других условий. Опубликованное изображение показывает результат, который я ожидаю от моего запроса. Данный запрос дает ожидаемый результат, и я думаю, что я вполне могу ожидать, что Джей добавит свои предложения и присоединится там, где это необходимо. –

+0

Вопрос задает совпадения, которые являются симметричным отношением. Ваш код не справляется с этим. Кроме того, если вы посмотрите на изображение, вы увидите, что CUSTID и TEMPID также соответствуют друг другу. Ваш ответ не смог их решить. –

0

Я бы сделать это с not exists:

if (exists (select 1 
      from tomatch m 
      where not exists (select 1 from list l where l.template = m.template) 
      ) 
    ) 
    return 'Bad' -- or whatever you want to return 
else return 'Good'; 

Если у вас есть в индексе на list(template), то я думаю, что это самый быстрый способ приблизиться к проблеме.

+0

Что делать, если в списке нет элемента, который не имеет совпадения в tomatch? –

0

Необходимо проверить оба направления, чтобы убедиться, что вы справляетесь со всеми отличиями:

if exists(
select 1 
from List 
where not exists (select 1 
        from Temp 
        where List.CUSTID = Temp.TEMPID and List.Template = Temp.template) 
union 
select 1 
from Temp 
where not exists (select 1 
        from List 
        where List.CUSTID = Temp.TEMPID and List.Template = Temp.template)) 
return 0; 
else return 1; 
Смежные вопросы