Выбираете только авторов, у которых есть статьи? - PullRequest
0 голосов
/ 13 сентября 2009

У меня есть два автора таблиц SQL Server и статьи, где первичный ключ авторов (AuthorID) - это внешний ключ в таблице статей, представляющий простое отношение один-ко-многим между авторами и таблицей статей. Теперь вот проблема, мне нужно выполнить полнотекстовый поиск по таблице авторов на основе имени, фамилии и столбцов биографии. Полнотекстовый поиск работает потрясающе и ранжируется и все. Теперь мне нужно добавить еще один критерий к моему поиску, мне нужно, чтобы все авторы, не являющиеся авторами статей, игнорировались из поиска. Чтобы добиться этого, я решил создать представление со всеми участниками, у которых есть статьи, и выполнить поиск по этому представлению. Поэтому я создал вид так:

    Create View vw_Contributors_With_Articles
AS 
Select * from Authors
Where Authors.ContributorID 
IN ( Select Distinct (Articles.ContributorId) From Articles)

Это работает, но мне действительно не нравится подзапрос. Объединение дает мне все избыточные идентификаторы authorID, пробовал разные, но не работал со столбцом биографии, так как его тип - ntext. Group by не сделает это для меня, потому что мне нужны все столбцы, а не их совокупность.

Как вы думаете, ребята? Как я могу улучшить это?

Ответы [ 3 ]

5 голосов
/ 13 сентября 2009

EXISTS допускает потенциальные дубликаты записей, когда на одного автора приходится несколько статей:

Select * from Authors
Where EXISTS (SELECT *
    FROM Articles
    WHERE Articles.ContributorId = Authors.ContributorId)

Edit: Чтобы уточнить, вы не можете отличить столбцы ntext. Таким образом, у вас не может быть решения JOIN, если вы не используете производную таблицу для статей в JOIN и не используете статьи напрямую. Или вы конвертируете ntext в nvarchar (max).

EXISTS или IN - ваш единственный выбор.

Редактировать 2:

... если вы действительно не хотите, чтобы использовал JOIN, и у вас SQL Server 2005 или выше, вы можете использовать CAST и DISTINCT (агрегат), чтобы избежать нескольких строк в выводе ...

select DISTINCT
  Authors.ContributorID,
  Authors.AnotherColumn,
  CAST(Authors.biography AS nvarchar(max)) AS biography,
  Authors.YetAnotherColumn,
  ...
from
  Authors
inner join
  Articles on
  Articles.ContributorID = Authors.ContributorID
0 голосов
/ 13 сентября 2009

Выберите отдельные идентификаторы contributorID из таблицы «Статьи», чтобы получить отдельных авторов, написавших статью, и присоедините таблицу «Авторы» к этому запросу - например,

select distinct Articles.contributorID, Authors.*
from Articles
join Authors on Articles.contributerID = Authors.ContributerId
0 голосов
/ 13 сентября 2009

Вы хотите внутреннее соединение

select
  *
from
  Authors
inner join
  Articles on
  Articles.ContributorID = Authors.ContributorID

Это вернет только авторов, у которых есть запись в таблице Articles, соответствующая ContributorID.

...