Как выполняется и оценивается запрос CONNECT BY
- шаг за шагом (по примеру).
Скажем, у нас есть следующая таблица и соединение по запросу:
select * from mytable;
X
----------
1
2
3
4
SELECT level, m.*
FROM mytable m
START with x = 1
CONNECT BY PRIOR x +1 = x OR PRIOR x + 2 = x
ORDER BY level;
Шаг 1:
Выберите строки из таблицы mytable
, которые соответствуют условию START WITH
, присвойте LEVEL = 1 возвращаемому набору результатов:
CREATE TABLE step1 AS
SELECT 1 "LEVEL", X from mytable
WHERE x = 1;
SELECT * FROM step1;
LEVEL X
---------- ----------
1 1
Шаг 2
Увеличить уровень на 1:
LEVEL = LEVEL + 1
Присоединить результирующий набор, возвращенный на предыдущем шаге, с помощью mytable
, используя условия CONNECT BY
в качестве условий соединения.
В этот раздел PRIOR column-name
относится к набору результатов, возвращаемому предыдущим шагом, а простой column-name
относится к таблице mytable
:
CREATE TABLE step2 AS
SELECT 2 "LEVEL", mytable.X from mytable
JOIN step1 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step2;
LEVEL X
---------- ----------
2 2
2 3
ШАГ x + 1
Повторить # 2 до последней операции возвращает пустой набор результатов.
Шаг 3
CREATE TABLE step3 AS
SELECT 3 "LEVEL", mytable.X from mytable
JOIN step2 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step3;
LEVEL X
---------- ----------
3 3
3 4
3 4
Шаг 4
CREATE TABLE step4 AS
SELECT 4 "LEVEL", mytable.X from mytable
JOIN step3 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step4;
LEVEL X
---------- ----------
4 4
Шаг 5
CREATE TABLE step5 AS
SELECT 5 "LEVEL", mytable.X from mytable
JOIN step4 "PRIOR"
ON "PRIOR".x +1 = mytable.x or "PRIOR".x + 2 = mytable.x;
select * from step5;
no rows selected
Шаг 5 не возвратил никаких строк, поэтому теперь мы завершаем запрос
Последний шаг
UNION ALL
результаты всех шагов и вернем его в качестве конечного результата:
SELECT * FROM step1
UNION ALL
SELECT * FROM step2
UNION ALL
SELECT * FROM step3
UNION ALL
SELECT * FROM step4
UNION ALL
SELECT * FROM step5;
LEVEL X
---------- ----------
1 1
2 2
2 3
3 3
3 4
3 4
4 4
Теперь применим описанную выше процедуру к вашему запросу:
SELECT * FROM dual;
DUMMY
-----
X
SELECT LEVEL FROM DUAL CONNECT BY rownum>5;
Шаг 1
С тех пор e не содержит предложение START WITH
, Oracle выбирает все записи из исходной таблицы:
CREATE TABLE step1 AS
SELECT 1 "LEVEL" FROM dual;
select * from step1;
LEVEL
----------
1
Шаг 2
CREATE TABLE step2 AS
SELECT 2 "LEVEL" from dual
JOIN step1 "PRIOR"
ON rownum > 5
select * from step2;
no rows selected
Поскольку на последнем шаге не было строк, мы собираемся завершить наш запрос.
Последний шаг
SELECT * FROM step1
UNION ALL
SELECT * FROM step2;
LEVEL
----------
1
Анализ последнего запроса:
select level from dual connect by rownum<10;
Я оставляю вас как домашнее задание.
Soundex довольно примитивен - он был первоначально разработан, чтобы быть вычисленной рукой. Это приводит к ключу, который может быть сравнен.
Soundex работает хорошо с западными именами, поскольку он был первоначально разработан для американских данных переписи. Это предназначается для фонетического сравнения.
расстояние Левенштейна смотрит на два значения и производит значение на основе их подобия. Это ищет пропавших без вести или буквы, которыми заменяют.
В основном Soundex лучше для нахождения, что "Schmidt" и "Smith" могли бы быть той же фамилией.
расстояние Левенштейна лучше для определения, что пользователь ввел "Levnshtein" с опечаткой;-)
Я предложил бы использовать Метафон , не Soundex. Как отмечено, Soundex был разработан в 19-м веке для американских имен. Метафон даст Вам некоторые результаты при проверке работы плохих спеллеров, кто "выведывает его" и записывает фонетически.
расстояние Редактирования способно находить опечатки, такие как повторенные буквы, транспонированные буквы, или нажимать неправильную клавишу.
Рассматривают заявление для решения, который будет соответствовать пользователям best— или используйте обоих вместе с Метафоном, дополняющим предложения, произведенные Levenshtein.
Относительно исходного вопроса, я использовал n-граммы успешно в приложениях информационного поиска.
Я соглашаюсь с Вами на Daitch-Mokotoff, Soundex смещается, потому что исходные американские счетчики хотели 'американизированные' имена.
, Возможно, пример на различии помог бы:
Soundex помещает дополнительное значение в запуск слова - на самом деле он только рассматривает первые 4 фонетических звука. Таким образом, в то время как "Schmidt" и "Smith" будут соответствовать "Smith", и "Wmith" не будет.
алгоритм Levenshtein был бы лучше для нахождения опечаток - один или два пропавших без вести или замененные буквы производят высокую корреляцию, в то время как фонетическое влияние тех, которые пропускают буквы, менее важно.
я не думаю, что любой лучше, и я рассмотрел бы и алгоритм расстояния и фонетический для помощи пользователям корректный введенный вход.
, Поскольку я отправил по другому вопросу, Daitch-Mokotoff лучше для нас европейцы (и я обсудил бы США).
я также считал Wiki на Levenshtein. Но я не вижу, почему (в реальной жизни) это лучше для пользователя, чем Soundex.