Это на Oracle 8i (см. Примечание внизу вопроса).
Я сопоставляю ключевые слова в строках. Строка specifici c приведет к появлению двух или более строк, если она соответствует более чем одному ключевому слову. Но я также хочу захватить строки, которые не совпадают в результатах.
Учтите следующее:
SELECT
FREE_TEXT.*,
KEYWORDS.KEYWORD
FROM
(
(SELECT 1 AS ID, 'I like potatoes' AS TXT FROM DUAL) UNION
(SELECT 2 AS ID, 'I like peppers' AS TXT FROM DUAL) UNION
(SELECT 3 AS ID, 'I like potatoes, peppers' AS TXT FROM DUAL) UNION
(SELECT 4 AS ID, 'I like onions' AS TXT FROM DUAL)
) FREE_TEXT,
(
(SELECT 1 AS ID, 'potato' AS KEYWORD FROM DUAL) UNION
(SELECT 2 AS ID, 'pepper' AS KEYWORD FROM DUAL) UNION
(SELECT 3 AS ID, 'carrot' AS KEYWORD FROM DUAL)
) KEYWORDS
WHERE
FREE_TEXT.TXT LIKE ('%' || KEYWORDS.KEYWORD || '%')
ORDER BY
FREE_TEXT.ID
Этот код дает следующее:
ID TXT KEYWORD
1 I like potatoes potato
2 I like peppers pepper
3 I like potatoes, peppers potato
3 I like potatoes, peppers pepper
Я хотел бы выполнить левое соединение, чтобы дополнительно получить эту строку:
ID TXT KEYWORD
4 I like onions NULL
Однако следующий синтаксис с использованием старого Oracle способа выполнения левого соединения с использованием (+), то есть:
WHERE FREE_TEXT.TXT LIKE ('%' || KEYWORDS.KEYWORD || '%') (+)
не работает и выдает ORA-00933: SQL command not properly ended
У меня Oracle 8i, поэтому я не могу выполнить синтаксис соединения ANSI-92 SQL.
ПРИМЕЧАНИЕ : Для ясности, я прекрасно понимаю, что 8i устарела и устарела, но я не могу это контролировать.