Pregunta

Tengo dos autores de tablas de SQL Server y artículos donde la clave primaria de autores (AuthorID) es una clave externa en la tabla de artículos para representar una relación simple de uno a muchos entre los autores y la tabla de artículos. Ahora, aquí está el problema, necesito emitir una búsqueda de texto completo en la tabla de autores basada en las columnas de nombre, apellido y biografía. La búsqueda de texto completo está funcionando increíble y ranking y todo. Ahora necesito agregar un criterio más a mi búsqueda, necesito que todos los contribuyentes que no son artículos sean ignorados de la búsqueda. Para lograr eso, elegí crear una vista con todos los contribuyentes que tienen artículos y buscar en esta vista. Así que creé la vista de esta manera:

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

Está funcionando pero realmente no me gusta la subconsulta. La unión me proporciona todos los ID de autor redundantes, intenté distintos pero no funcionó con la columna de biografía, ya que su tipo es ntext. Group by no lo haría por mí porque necesito todas las columnas, no un agregado de ellas.

¿Qué les parece chicos? ¿Cómo puedo mejorar esto?

¿Fue útil?

Solución

Un EXISTS permite las posibles entradas duplicadas cuando hay varios artículos por autor:

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

Editar: Para aclarar, no puede DISTINCTARSE en columnas ntext. Por lo tanto, no puede tener una solución JOIN, a menos que use una tabla derivada de artículos en JOIN y evite usar artículos directamente. O convierte el ntext a nvarchar (max).

EXISTS o IN es su única opción.

Editar 2:

... a menos que realmente quiera usar JOIN y tenga SQL Server 2005 o superior, puede CAST y DISTINCT (agregado) para evitar múltiples filas en la salida ...

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

Otros consejos

Quieres una unión interna

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

Esto devolverá solo a los autores que tengan una entrada en la tabla Artículos , que coincida con FollowersID .

Seleccione los ID de contribuidor distintos de la tabla Artículos para obtener los autores individuales que han escrito un artículo, y únase a la tabla Autores a esa consulta, así que algo así como

select distinct Articles.contributorID, Authors.*
from Articles
join Authors on Articles.contributerID = Authors.ContributerId
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top