只选择有文章的作者?

时间:2009-09-13 12:33:07

标签: 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)

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

你觉得伙计们怎么样?我该如何改进?

3 个答案:

答案 0 :(得分:5)

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

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

编辑: 为了澄清,你不能在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

答案 1 :(得分:0)

你想要一个内部联接

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

这将仅返回在Articles表上有条目且与ContributorID匹配的作者。

答案 2 :(得分:0)

从Articles表中选择不同的contributorID以获取撰写文章的各个作者,并将Authors表加入该查询 - 所以类似

select distinct Articles.contributorID, Authors.*
from Articles
join Authors on Articles.contributerID = Authors.ContributerId