Я пытаюсь написать хранимую процедуру, и это включает в себя сопоставление списка строк в таблице со столбцом в другой таблице. Если даже одна строка текста в столбце неверна по сравнению с таблицей, процедура прерывается.SQL - найти строку соответствия и остановить, если не найден
ответ
Используйте это простое правило:
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
Что делать, если в ListTable нет элемента, который не существует в TableToMatch? –
Теперь выполняется симметричное совпадение, но проблема все еще остается: что, если шаблоны соответствуют, но CUSTID не соответствует TEMPID? –
Если я хочу обновить столбец в TableToMatch с помощью CUSTID в ListTable, сделаю ли я обновление после THROW? Спасибо – Jay
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
Вы не сравниваете CUSTID с TEMPID. Что делать, если есть шаблоны с тем же именем, но с разными CUSTID и TEMPID? Кроме того, что, если в T есть элемент, который не существует в L? –
@Lajos: Вопрос в том, что вопрос прост в том, что если какая-либо строка в таблице T недоступна в таблице L, то сделайте перерыв. Вопрос никогда не упоминал никаких других условий. Опубликованное изображение показывает результат, который я ожидаю от моего запроса. Данный запрос дает ожидаемый результат, и я думаю, что я вполне могу ожидать, что Джей добавит свои предложения и присоединится там, где это необходимо. –
Вопрос задает совпадения, которые являются симметричным отношением. Ваш код не справляется с этим. Кроме того, если вы посмотрите на изображение, вы увидите, что CUSTID и TEMPID также соответствуют друг другу. Ваш ответ не смог их решить. –
Я бы сделать это с 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)
, то я думаю, что это самый быстрый способ приблизиться к проблеме.
Что делать, если в списке нет элемента, который не имеет совпадения в tomatch? –
Необходимо проверить оба направления, чтобы убедиться, что вы справляетесь со всеми отличиями:
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;
- 1. Как остановить, если в командной строке не найти строку?
- 2. Найти строку соответствия позиции?
- 3. Найти ближайшую строку соответствия
- 4. Найти строку соответствия шаблону и удалить строку sed
- 5. Как вставить строку, если ID не найден?
- 6. Найти точную строку соответствия, которая содержит символ +
- 7. Как найти строку соответствия с отсутствующей буквой?
- 8. Предупреждающее сообщение, если Autocomplete не может найти соответствия
- 9. Найти версию JRE и установить ее, если не найден
- 10. проверить, если 2 массивы имеют строку соответствия
- 11. как распечатать строку, если матч найден
- 12. как найти строку соответствия между «{}» в node.js
- 13. Найти строку в последней позиции строкового регистра нечувствительным, добавить предопределенную строку, если не найден
- 14. sql-запросы, чтобы найти атрибуты соответствия
- 15. найти текст между 2 строки, если не найден пустой
- 16. R: Найти строку соответствия, а затем скопировать строку
- 17. Разделите большую строку и остановите, если найден конкретный символ
- 18. Нет профиля обеспечения соответствия не найден Xcode
- 19. Поиск и вставка, если не найден
- 20. php взорвать строку тега и удалить повторяющуюся строку соответствия
- 21. Не удалось найти строку
- 22. Пропустить Остальную строку, если найден символ
- 23. «Если» идентификатор не найден
- 24. Найти все URLS в строке и закодировать строку запроса? найден
- 25. Как найти записи соответствия в SQL, и если они найдены, то обновить
- 26. Найти узел-брат, если указанный узел найден
- 27. Распечатать последнюю строку соответствия
- 28. XmlTextReader, если текст не найден
- 29. Найти команды должны быть неуспешным, если файл не найден
- 30. Excel найти соответствующее значение, возвращаемое '0', если не найден
отправьте изображение как текст, некоторые примеры данных, ожидаемый результат .. Посмотрите здесь, как улучшить вопрос..https: //spaghettidba.com/2015/04/24/how-to-post- at-sql-question-on-a-public-forum/ – TheGameiswar
Джей, должен ли CUSTID соответствовать TEMPID? Полагаю, что это должно произойти, но по этому поводу есть дискуссия. –