Пытаюсь сделать свой первый цикл в SQL, но ошибка в объявлении переменной

Во-первых, просто скажу, что я здесь новичок и новичок в программировании, поэтому я никогда не использовал sql в sap.

Я пытаюсь научиться создавать запрос, в котором я пытаюсь зациклить таблицу. Вот сокращенный вариант таблицы:

ОАЛИ

OrigItem AltItem
1        2
2        3
4        5
5        6

Я хочу получить последний AltItem в цепочке, поэтому 1 даст 3, а 4 будет 6.

OrigItem AltItem FinalItem
1        2       3
2        3       3
4        5       6
5        6       6

Я уверен, что это просто, но я получаю ошибку при объявлении переменной.

Кстати, если вы можете помочь мне с хорошим местом для изучения SQL для SAP, вы молодец.

Спасибо.


person BrunoR    schedule 19.03.2017    source источник
comment
Что вы пробовали до сих пор, какой код вы использовали и каково было точное сообщение об ошибке? Пожалуйста, ознакомьтесь с рекомендациями по как задать хороший вопрос и попробуйте предоставить минимальный пример.   -  person vwegert    schedule 19.03.2017
comment
Это может привести к одному SELECT или subSELECT на строку таблицы, если она содержит одну большую цепочку. Это облако занимает несколько дней. Если в таблице менее 2 миллиардов строк, возможно, вам лучше выбрать каждую строку во внутреннюю таблицу.   -  person András    schedule 19.03.2017
comment
Пока вы опр. следует попытаться сделать ваш сценарий более понятным, кажется, вы ищете запрос графа/иерархии, чтобы найти последний AltItem для любой цепочки OrigItem -> AltItem. Это классический запрос иерархии, и в зависимости от вашего реального сценария SAP HANA предоставляет несколько вариантов для их моделирования. Обратите внимание на Hierarchy в руководстве по моделированию.   -  person Lars Br.    schedule 20.03.2017
comment
Прежде всего, я извиняюсь за то, что не привел ни одного примера своей работы, но, поскольку я новичок в программировании и перешел в программирование по необходимости, я почти уверен, что мой пример не будет иметь особого смысла.   -  person BrunoR    schedule 20.03.2017
comment
Прежде всего, я прошу прощения за то, что не предоставил ни одного примера своей работы, но, поскольку я новичок в программировании и на сайте, и я перешел в программирование по необходимости, я почти уверен, что мой пример не будет иметь особого смысла. , но вот оно @vwegert: DECLARE i int =0; SELECT T0.OrigItem, T0.AltItem, WHILE i‹›NULL DO SELECT T0.OrigItem, T0.AltItem FROM OALI T0 WHERE i=T0.OrigItem; i=T0.AltItem END WHILE FROM OALI T0   -  person BrunoR    schedule 20.03.2017
comment
@András Андрас, я очень мало понимаю в программировании, но, поскольку таблица небольшая, меньше 10 000 строк, я думаю, что это не повлияет на систему каждый раз, когда я запускаю запрос.   -  person BrunoR    schedule 20.03.2017
comment
OALI = SAP B1 = Я выхожу. И я не уверен, работает ли B1 на HANA, поэтому тег, возможно, тоже неверен.   -  person vwegert    schedule 20.03.2017
comment
@vwegert спасибо, мне сказали, что наша версия B1 (9.2) работает с HANA, поэтому я предполагаю, что это правда.   -  person BrunoR    schedule 20.03.2017
comment
Вы используете SQL или HANA? Это очень разные вещи. В вашем вопросе написано SQL, но ваши теги говорят HANA. SAP B1 работает либо на SQL, либо на HANA, это зависит от вашей индивидуальной установки (например, мы используем 9.1 на SQL 2012).   -  person Zac Faragher    schedule 06.04.2017
comment
@ZacFaragher HANA 9.1   -  person BrunoR    schedule 23.08.2017


Ответы (1)


Вы не можете сделать оператор WHILE внутри оператора SELECT, это просто не сработает.

То, как вы это сделаете, зависит от того, чего именно вы пытаетесь достичь.

Вы можете использовать курсор, чтобы получить набор результатов, который вы можете перебирать, или сохранить свои временные результаты в #Temp_Table или @Table_Variable и удалить их один за другим по завершении итерации.

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

Одна вещь, на которую вы могли бы обратить внимание, это вложенные операторы SELECT, например:

SELECT OrigItem, AltItem,
    (SELECT COUNT(AltItem)
         FROM OALI T1
         WHERE T0.OrigItem = T1.OrigItem) as 'AltItem Count'
FROM OALI T0
person Zac Faragher    schedule 06.04.2017