Question

J'ai deux auteurs de tables SQL Server et des articles dans lesquels la clé primaire d'auteurs (AuthorID) est une clé étrangère dans la table d'articles afin de représenter une simple relation un-à-plusieurs entre les auteurs et la table d'articles. Maintenant, voici le problème, je dois lancer une recherche en texte intégral sur la table authors en fonction des colonnes prénom, nom et biographie. La recherche en texte intégral fonctionne à merveille et le classement et tout. Maintenant, je dois ajouter un critère supplémentaire à ma recherche. Tous les contributeurs non articles doivent être ignorés de la recherche. Pour ce faire, j'ai choisi de créer une vue avec tous les contributeurs qui ont des articles et de rechercher cette vue. J'ai donc créé la vue de cette façon:

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

Cela fonctionne mais je n’aime vraiment pas les sous-requêtes. La jointure me permet d'obtenir tous les authorID redondants, essayés séparément mais ne fonctionnant pas avec la colonne biographie car son type est ntext. Groupe par ne le ferait pas pour moi parce que j'ai besoin de toutes les colonnes et non d'un agrégat.

Qu'en pensez-vous les gars? Comment puis-je améliorer cela?

Était-ce utile?

La solution

Un élément EXISTS permet les doublons potentiels lorsqu'il y a plusieurs articles par auteur:

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

Modifier: Pour clarifier, vous ne pouvez pas DISTINCT sur les colonnes ntext. Donc, vous ne pouvez pas avoir une solution JOIN, à moins que vous utilisiez une table dérivée sur les articles dans JOIN et évitez d'utiliser des articles directement. Ou vous convertissez le ntext en nvarchar (max).

EXISTS ou IN est votre seule option.

Modifier 2:

... sauf si vous voulez vraiment utiliser une jointure et que vous disposiez de SQL Server 2005 ou version ultérieure, vous pouvez CAST et DISTINCT (agréger) pour éviter plusieurs lignes dans la sortie ...

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

Autres conseils

Vous voulez une jointure interne

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

Ceci renverra uniquement les auteurs ayant une entrée dans la table Articles , correspondant à ContributorID .

Sélectionnez les identifiants contributor distincts dans la table Articles pour obtenir les auteurs individuels qui ont écrit un article, et joignez la table Auteurs à cette requête - pour obtenir quelque chose comme

.
select distinct Articles.contributorID, Authors.*
from Articles
join Authors on Articles.contributerID = Authors.ContributerId
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top