Присоедините 3 таблицы для mysql и получите ошибку [duplicate]

Изменение кода для поиска без учета регистра с использованием запроса 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;
0
задан David Thomas 18 April 2010 в 00:42
поделиться

2 ответа

Попробуйте переключить 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)
1
ответ дан Pablo Santa Cruz 18 August 2018 в 08:30
поделиться
  • 1
  • 2
    Работает? Я думаю, что если вы это сделаете: пользователи u, Settings s left join WHATEVER, вы пытаетесь выполнить соединение в настройках, а не в Users. – Pablo Santa Cruz 18 April 2010 в 00:48

Не смешивать синтаксис соединения 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. Лучше просто прекратить использование устаревшего синтаксиса соединения с запятыми. Тогда любое выражение объединения имеет доступ ко всем вашим псевдонимам таблицы, и вы никогда не будете иметь эту проблему в любом запросе.

4
ответ дан Bill Karwin 18 August 2018 в 08:30
поделиться
  • 1
    Да, это должен быть декартовой продукт. Однако мне не удалось использовать перекрестное соединение. Не могли бы вы объяснить, почему псевдоним u, созданный в Pablos, отвечает только потому, что он задан вторым вместо первого (как в моем первоначальном запросе)? – Ropstah 18 April 2010 в 00:57
  • 2
  • 3
    Совет: перекрестное соединение эквивалентно внутреннему соединению без условия или с условием, которое всегда true. – Bill Karwin 18 April 2010 в 01:48
  • 4
    Другими словами, действительно существует really отсутствие причины использовать синтаксис соединения в стиле запятой. – Bill Karwin 18 April 2010 в 01:48
Другие вопросы по тегам:

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