Как сформулировать ДЛЯ КАЖДОГО цикла в SQL?

#tsql #foreach

#tsql #foreach

Вопрос:

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

Итак, моя структура исходной таблицы:

 group   mode   p-val
-----   ----   ------
A       B      4.567
C       D      3.694
  

Как я могу настроить цикл для перебора каждой комбинации групп / режимов? И я бы предпочел не использовать курсоры!

Комментарии:

1. Пожалуйста, правильно форматируйте свои сообщения, как было запрошено ранее. Что цикл делает на каждом шаге? Если это что-то изначально процедурное, то не было бы особой причины использовать другую циклическую конструкцию вместо курсоров (поскольку они специально разработаны для перебора строк результатов). Лучше всего было бы переписать его на основе набора, но вы предоставили нам ровно нулевую информацию, чтобы начать здесь.

2. Это то, что вы показываете примерные входные данные или ожидаемые выходные данные?

3. @Thomas, это пример ввода.

Ответ №1:

Очень широкий и общий вопрос. Вот общий ответ.

Сначала напишите запрос для извлечения набора интересующих вас значений, чтобы каждый набор был уникальным. SELECT DISTINCT... и SELECT... GROUP BY... предлагают сами.

Эти данные могут быть сохранены в виде временной таблицы, включены в качестве подзапроса или просто включены в общий конечный запрос. То, что лучше всего использовать, полностью зависит от того, над чем вы работаете.

Затем напишите свой «основной» запрос на обработку, используя это подмножество в качестве основы. Что-то вроде ...FROM <theSubset> INNER JOIN <etc> .

Выполненный должным образом (я не говорю, что это было бы легко), эффект этой методологии, основанной на множествах, очень похож на результаты, достигнутые при процедурном циклировании.

Комментарии:

1. Прошу прощения за обобщенность моего вопроса. Но проблему трудно объяснить полностью. Тем не менее, я исправил эту проблему, используя подход на основе набора или курсора сейчас! Потребовалось много работы, но я смог выполнить цикл WHILE для реализации этой логики

Ответ №2:

Это вызывается JOIN в sql. т.е. оператор

 SELECT * FROM table AS a JOIN table AS b;
  

Результаты

 a | b | 4.5   | a | b | 4.5
a | b | 4.5   | c | d | 3.694
c | d | 3.694 | a | b | 4.5
c | d | 3.694 | c | d | 3.694
  

теперь у вас есть все комбинации записей [group, mode]. Подробнее о соединениях читайте в Google.