Подзапрос SQL, Который Присоединяет Таблицу Обратно К Себе, Ссылаясь На Другую Таблицу

#mysql #sql #join #subquery #snowflake-cloud-data-platform

Вопрос:

У меня есть две таблицы; таблица журнала, которая связана с таблицей издателя через столбец Publisher_ID, общий для обеих таблиц.

В таблице журналов есть столбец для категорий в зависимости от того, на чем сосредоточено содержание этого конкретного журнала (например, мода, знаменитости, автомобили, спорт, охота и т. Д.). У многих издателей есть журналы, охватывающие множество категорий, но некоторые-только несколько.

Я хочу запустить запрос, в котором я выберу 100 лучших названий журналов, которые находятся в категории «автомобили», а затем присоединю эти журналы к связанным с ними издателям, но затем выберу остальные названия этих издателей, независимо от того, являются ли эти журналы автомобилями или нет.

т. е. я хочу выбрать все журналы от издателей, которые объединены из первых 100 выбранных журналов, ориентированных на автомобили.

В результате я надеюсь на все колонки из журнала и связанных с ними примкнул издатель столбцы таблицы, и должна принести гораздо больше, чем 100 журналов, в том числе в категориях больше, чем просто «автомобили» , но только от издателей, которые имеют как минимум один журнал название, что находится в «легковую» категорию, исключая какие-либо издательства (и соответствующих журналов), который не публиковать автомобильных журналов.

Попытка запроса, с которой я работал, находится здесь:

 SELECT Magazine.*,Publisher.*
FROM 
    Magazine
INNER JOIN 
    Publisher
ON
    Magazine.publisher_id = publisher.publisher_id
WHERE (SELECT Magazine.category
       FROM Magazine
       WHERE Magazine.category = 'cars' 
       LIMIT 100)
;
 

результат, который я получил, был таким

 Single-row subquery returns more than one row.
 

Извините за изложение, но я хотел быть как можно более описательным в том, чего я пытаюсь достичь.

Ответ №1:

Вы не говорите, как вы выбираете 100 журналов. Но для 100 произвольных журналов вы можете использовать IN или EXISTS :

 SELECT m.*, p.*
FROM Magazine m INNER JOIN 
     Publisher p
     ON m.publisher_id = p.publisher_id
WHERE p.publisher_id IN (SELECT m2.publisher_id
                         FROM Magazine m2
                         WHERE m2.category = 'cars' 
                         LIMIT 100
                        );
 

Комментарии:

1. Таким образом, этот запрос выполняется, но содержит только 100 строк. Я надеялся, что независимо от 100 лучших журналов, в которых есть категория «автомобили», она затем включит все связанные журналы от издателей, связанных с этим подзапросом.

2. @JLuu . . . Это имеет смысл. Сравнение должно быть по идентификатору издателя, а не по идентификатору журнала.