Почему этот запрос останавливает всю мою базу данных? - PullRequest
2 голосов
/ 16 сентября 2011
SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011` 
WHERE `groupon-spain-6sep-2011`.`code`= 5654 
    OR  `Hoja1`.`code` = "5654 
    OR `GroupaliaJuly2011`.`code` = 5654

Ответы [ 3 ]

9 голосов
/ 16 сентября 2011

У вас отсутствуют какие-либо условия соединения, связывающие таблицы друг с другом, поэтому выполняется декартово объединение 3 таблиц.

Я рекомендую всегда использовать явный синтаксис объединения

SELECT *
FROM   `groupon-spain-6sep-2011`
       JOIN `hoja1` ON `groupon-spain-6sep-2011`.foo=`hoja1`.foo
       JOIN `groupaliajuly2011` ON `groupaliajuly2011`.`foo` = `hoja1`.foo
WHERE  `groupon-spain-6sep-2011`.`code` = 5654
        OR `hoja1`.`code` = 5654
        OR `groupaliajuly2011`.`code` = 5654  

Хотя возможно, что вы, возможно, хотите здесь Союз, я так или иначе думаю?

6 голосов
/ 16 сентября 2011

Вместо этого вы можете захотеть объединиться:

SELECT * 
    FROM groupon-spain-6sep-2011
    WHERE code = 5654
UNION SELECT * 
    FROM Hoja1
    WHERE code = 5654
UNION SELECT * 
    FROM GroupaliaJuly2011
    WHERE code = 5654
6 голосов
/ 16 сентября 2011

Запрос, который вы задали, включает декартово произведение (также известное как CROSS JOIN в стандартном SQL, спасибо за совет @onedaywhen) трех таблиц, количество записей будет равно size (A) * size (B) * size(С).Поэтому, если общий продукт достаточно велик, он заполнит значительный объем памяти, что сделает вашу базу данных неспособной ответить на любой другой запрос, что приведет к «зависанию» вашей базы данных.

Я заметил, что вы хотите, чтобы любой из трех указанных столбцов имел одинаковое значение «5654», поэтому вы можете выбрать кортежи из трех таблиц соответственно, а затем объединить их вместо того, чтобы делать из них декартово произведение, как вы это делаете сейчастак как я не думаю, что декартово произведение, которое вы делаете, имеет какой-то смысл.Это сэкономит БОЛЬШОЕ количество памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...