只选择有文章的作者?

Gal*_*you 0 sql sql-server full-text-search subquery distinct

我有两个SQL Server表作者,以及作者主键(AuthorID)是articles表中的外键以表示authors和articles表之间简单的一对多关系的文章.现在问题是,我需要根据名字,姓氏和传记列在authors表上发出全文搜索.全文搜索工作真棒和排名等等.现在我需要在搜索中添加一个标准,我需要从搜索中忽略所有非文章贡献者.为了实现这一点,我选择创建一个视图,其中所有贡献者都有文章并搜索此视图.所以我用这种方式创建了视图:

    Create View vw_Contributors_With_Articles
AS 
Select * from Authors
Where Authors.ContributorID 
IN ( Select Distinct (Articles.ContributorId) From Articles)
Run Code Online (Sandbox Code Playgroud)

它工作但我真的不喜欢子查询的东西.连接获取了所有冗余的authorID,尝试了不同但不适用于传记列,因为它的类型是ntext.Group by不会为我做,因为我需要所有列而不是它们的任何聚合.

你们觉得怎么样?我怎样才能改善这个?

gbn*_*gbn 5

当每位作者有多篇文章时,EXISTS允许潜在的重复条目:

Select * from Authors
Where EXISTS (SELECT *
    FROM Articles
    WHERE Articles.ContributorId = Authors.ContributorId)
Run Code Online (Sandbox Code Playgroud)

编辑:为了澄清,你不能在ntext列上进行DISTINCT.因此,您不能拥有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
Run Code Online (Sandbox Code Playgroud)