我有两个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不会为我做,因为我需要所有列而不是它们的任何聚合。
你觉得伙计们怎么样?我该如何改进?
答案 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