Что делает `join` в терминах эквин в SQL или операций в реляционной алгебре?

Я никогда раньше не использовал select , а также никогда раньше не использовал массивы bash, поэтому вот версия 0.1 из меню, которое перебирает 25 пунктов за раз. Количество элементов одновременно установлено как howmany . Вам нужно добавить логику для возврата к началу. Он также не делает ничего интересного с выбором в меню. Вы можете захотеть прервать , когда пользователь выбирает фактический пункт меню.

Интересные части - это пополнение массива CURRNUMS на основе начального и конечного индексов и включение дополнительного «следующего» элемента в цикл select .

ALLNUMBERS=({30..90})
start=0
howmany=25
while :
do
  end=$((start + howmany - 1))
  CURRNUMS=
  for (( i = start; i < end ; i++ ))
  do
    cindex=$((i - start))
    CURRNUMS[$cindex]=${ALLNUMBERS[$i]}
  done
  echo Presenting a new set of menu items...
  select number in ${CURRNUMS[*]} next; do
    echo You picked $REPLY
    echo number is now: $number
    if [ $REPLY = "next" ] || [ $REPLY = $howmany ] ; then
      start=$end
      break;
    fi
  done
done

Вот пример вывода:

Presenting a new set of menu items...
1) 30      5) 34     9) 38    13) 42    17) 46    21) 50    25) next
2) 31      6) 35    10) 39    14) 43    18) 47    22) 51
3) 32      7) 36    11) 40    15) 44    19) 48    23) 52
4) 33      8) 37    12) 41    16) 45    20) 49    24) 53
#? 2
You picked 2
number is now: 31
#? 25
You picked 25
number is now: next
Presenting a new set of menu items...
1) 54      5) 58     9) 62    13) 66    17) 70    21) 74    25) next
2) 55      6) 59    10) 63    14) 67    18) 71    22) 75
3) 56      7) 60    11) 64    15) 68    19) 72    23) 76
4) 57      8) 61    12) 65    16) 69    20) 73    24) 77
#? 3
You picked 3
number is now: 56
#? next
You picked next
number is now:
Presenting a new set of menu items...
1) 78      3) 80     5) 82     7) 84     9) 86    11) 88    13) 90
2) 79      4) 81     6) 83     8) 85    10) 87    12) 89    14) next
#? ^C
-1
23.07.2018, 20:32
1 ответ

Утилита joinпо умолчанию выполняет так называемое «внутреннее соединение» в SQL, в результате чего объединяются записи тех записей, поле соединения которых идентично в обоих файлах. Да, это "equi -соединение", так как оно использует равенство для проверки между полями.

Утилита joinможет выполнять внутренние соединения (по умолчанию ), а также левые, правые и внешние соединения (с использованием -a1, -a2и -a1 -a2соответственно ). Все эти соединения являются "равными -соединениями" с join, поскольку для сравнения используется равенство.

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

Поведение joinпо умолчанию аналогично

SELECT * FROM table1 JOIN table2 ON (table1.firstfield = table2.firstfield);

за исключением того, что вы получите только одну копию поля соединения(firstfieldздесь ).

4
28.01.2020, 05:07

Теги

Похожие вопросы