0

SQL Server テーブルの author が 2 つあり、article の主キー (AuthorID) は、articles テーブルの外部キーであり、authors テーブルと article テーブルの間の単純な 1 対多の関係を表します。ここで問題が発生します。名前、姓、および経歴の列に基づいて、authors テーブルで全文検索を実行する必要があります。全文検索は素晴らしく、ランキングなどすべて機能しています。ここで、検索にもう 1 つの条件を追加する必要があります。記事以外の寄稿者はすべて検索から除外する必要があります。それを達成するために、記事を持つすべての寄稿者を含むビューを作成し、このビューに対して検索することにしました。だから私はこの方法でビューを作成しました:

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

それは機能していますが、サブクエリが本当に好きではありません。結合により、すべての冗長な authorID が取得され、個別に試行されましたが、タイプが ntext であるため、biography 列では機能しませんでした。グループ化では、すべての列が必要なので、それらの集計ではありません。

皆さんどう思いますか?どうすればこれを改善できますか?

4

3 に答える 3

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
于 2009-09-13T12:42:21.367 に答える
0

内部結合が必要です

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

これは、テーブルにエントリがありArticles、一致する著者のみを返しますContributorID

于 2009-09-13T12:37:42.640 に答える
0

Articles テーブルから個別の contributorID を選択して、記事を書いた個々の著者を取得し、Authors テーブルをそのクエリに結合します。

select distinct Articles.contributorID, Authors.*
from Articles
join Authors on Articles.contributerID = Authors.ContributerId
于 2009-09-13T13:00:45.200 に答える