Изменение кода для поиска без учета регистра с использованием запроса LIKE вместо нахождения точных совпадений ...
DECLARE
match_count INTEGER;
-- Type the owner of the tables you want to search.
v_owner VARCHAR2(255) :='USER';
-- Type the data type you're looking for (in CAPS). Examples include: VARCHAR2, NUMBER, etc.
v_data_type VARCHAR2(255) :='VARCHAR2';
-- Type the string you are looking for.
v_search_string VARCHAR2(4000) :='Test';
BEGIN
dbms_output.put_line( 'Starting the search...' );
FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and data_type = v_data_type) LOOP
EXECUTE IMMEDIATE
'SELECT COUNT(*) FROM '||t.table_name||' WHERE LOWER('||t.column_name||') LIKE :1'
INTO match_count
USING LOWER('%'||v_search_string||'%');
IF match_count > 0 THEN
dbms_output.put_line( t.table_name ||' '||t.column_name||' '||match_count );
END IF;
END LOOP;
END;
Попробуйте переключить User
и Settings
в предложении from:
SELECT
`u`.`usr_auto_key` AS `u__usr_auto_key`,
`s`.`set_auto_key` AS `s__set_auto_key`,
`u2`.`usr_auto_key` AS `u2__usr_auto_key`,
`u2`.`set_auto_key` AS `u2__set_auto_key`,
`u2`.`value` AS `u2__value`
FROM `Setting` `s`, `Users` `u`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key`
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)
Не смешивать синтаксис соединения SQL-89 с «синтаксисом» в стиле «запятой» с синтаксисом SQL-92 JOIN
. Есть тонкие проблемы с приоритетом этих двух типов операций объединения.
В вашем случае последствием является то, что он оценивает условие соединения LEFT JOIN
до того, как существует псевдоним таблицы u
. Вот почему он не знает, что такое u.usr_auto_key
.
Вы можете исправить эту проблему, используя синтаксис JOIN
для всех соединений:
SELECT
`u`.`usr_auto_key` AS `u__usr_auto_key`,
`s`.`set_auto_key` AS `s__set_auto_key`,
`u2`.`usr_auto_key` AS `u2__usr_auto_key`,
`u2`.`set_auto_key` AS `u2__set_auto_key`,
`u2`.`value` AS `u2__value`
FROM `User` `u` JOIN `Setting` `s`
LEFT JOIN `User_Setting` `u2` ON `u`.`usr_auto_key` = `u2`.`usr_auto_key`
WHERE (`s`.`sct_auto_key` = 1 AND `u`.`usr_auto_key` = 1 AND admin_property is null)
Я не видел какое-либо условие соединения между u
и s
в вашем запросе, поэтому я предполагаю, что вы намереваетесь, чтобы это было декартово произведение?
Подробнее о взаимодействии двух синтаксических форм для соединения , см. раздел Присоединение изменений обработки в MySQL 5.0.12 на странице http://dev.mysql.com/doc/refman/5.0/ru/join.html
Ваш комментарий: Как я уже сказал, это связано с приоритетом оператора. Если у вас есть запрос SQL с FROM A, B JOIN C
, тогда он оценивает B JOIN C
, прежде чем он обратит внимание на A
, который включает назначение псевдонимов таблицы. Поэтому, если ваше условие соединения для B JOIN C
использует псевдоним таблицы для A
, вы получаете сообщение об ошибке, потому что этот псевдоним еще не существует.
Если вы отмените его и запустите B, A JOIN C
, то при его оценке условие соединения для A JOIN C
доступно для псевдонима для A
, и оно работает (в этом случае, по крайней мере).
Но это хрупкое решение, потому что вам также может понадобиться запрос, t фиксируется только путем переупорядочения A
и B
. Лучше просто прекратить использование устаревшего синтаксиса соединения с запятыми. Тогда любое выражение объединения имеет доступ ко всем вашим псевдонимам таблицы, и вы никогда не будете иметь эту проблему в любом запросе.
u
, созданный в Pablos, отвечает только потому, что он задан вторым вместо первого (как в моем первоначальном запросе)?
– Ropstah
18 April 2010 в 00:57
true
.
– Bill Karwin
18 April 2010 в 01:48