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不会为我做,因为我需要所有列而不是它们的任何聚合.
你们觉得怎么样?我怎样才能改善这个?
当每位作者有多篇文章时,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)