Избегайте предложения SQL WHERE NOT IN

У меня есть 3 таблицы, перечисленные ниже:

Blog    BlogArticle  Article
----    -----------  -------
        id
id------blog_id      -id
title   article_id__/ title

Этот SQL описывает то, что я хочу:

SELECT * 
FROM  `article` 
WHERE  `article`.`id` NOT IN (
        SELECT CONCAT(`blog_article`.`article_id`) 
        FROM  `blog_article` 
        WHERE  `blog_article`.`blog_id` = 1 -- example value
       )

Проблема в том, что в этом случае у меня большие значения NOT IN, и, насколько я знаю, это повлияет на производительность сервера (я не уверен, так как я никогда не пытался сравнить или гуглить это). Любое предложение?


person pengemizt    schedule 06.11.2011    source источник
comment
Какую базу данных вы используете? Например, SQL Server 2008 преобразует IN в EXISTS. Я где-то читал здесь, что последняя версия MySQL делает то же самое. Вы можете сделать то же самое, если в вашей документации по БД ничего подобного не упоминается.   -  person Icarus    schedule 06.11.2011
comment
@Icarus: SQL Server 2008 не является базой данных. Предложение: спросите, какой продукт SQL...?   -  person onedaywhen    schedule 07.11.2011
comment
@onedaywhen: Какую базу данных вы используете? и Sql Server 2008... это два разных предложения. Если у вас есть проблемы с пониманием прочитанного, я ничего не могу с этим поделать.   -  person Icarus    schedule 07.11.2011
comment
@Icarus: Вы можете помочь мне понять, почему вы хотите знать, какую базу данных они используют. Если бы я сказал вам, что они используют базу данных «Блоги» своего предприятия или tempdb/Master и т. д., как это поможет?   -  person onedaywhen    schedule 07.11.2011
comment
@Icarus Какую базу данных вы используете? Например, SQL Server 2008... Эти два предложения должны быть независимыми предложениями? Второй мне кажется зависимым от первого.   -  person onedaywhen    schedule 07.11.2011


Ответы (1)


Попробуй это :

SELECT * 
FROM  `article` 
LEFT JOIN `blog_article` ON CONCAT(`blog_article`.`article_id`) = `article`.`id`
                            AND  `blog_article`.`blog_id` = 1 -- example value
WHERE `blog_article`.`article_id` is null --replace the not in
person GregM    schedule 06.11.2011
comment
Эй, спасибо, это работает, если я запускаю напрямую, но я думаю, что у меня есть некоторые проблемы, когда я использую Yii AR Class. Ошибка говорит SQLSTATE [23000]: нарушение ограничения целостности: 1052 'id' столбца в списке полей неоднозначен. Заранее спасибо. - person pengemizt; 06.11.2011
comment
Извините, вы не знаете класс Yii AR, по крайней мере, ваш sql работает, вы можете написать этот ответ как принятый и опубликовать новый вопрос для своего класса. - person GregM; 06.11.2011
comment
@ user1032315 Неоднозначные ошибки столбца в основном (всегда?) означают, что в объединении есть два столбца с одинаковыми именами. Попробуйте SELECT 'article'.* вместо SELECT *. - person potNPan; 06.11.2011