我遇到一个问题,我的查询无法按相关性排序,因为我声明了'column'MATCH并尝试按顺序排序。
我正在尝试使用UNION
创建存储过程。
此查询有一些我需要遵循的规则,因为我需要带3篇相关文章。每个规则都有一个我试图将它们联合起来的查询。
让我解释一下这些规则:
CampanhaId
)我需要在修道院中遵循这些规则并搜索当时经过的前三篇文章。
因此,如果第一条规则至少没有3篇文章,那么第二条规则将尝试填写它。第三和第四条规则遵循相同的方式。
我尝试创建这样的查询:
CREATE PROCEDURE [dbo].[SP_GetNoticiaRelacionada]
(@Tag VARCHAR(50), @ExtranetId INT, @CampanhaAreaId INT, @NoticiaId INT)
AS
BEGIN
SELECT TOP 3 *
FROM
(SELECT DISTINCT
ArtigoId, CategoriaId, Titulo, Conteudo,
Subtitulo, Categoria, FotoCompacta, QtdResposta,
0 AS MATCH, DataAlteracao
FROM
(SELECT
A.ArtigoId, A.CategoriaId, A.Titulo, A.Conteudo,
A.Subtitulo, C.Nome AS Categoria,
A.ImgAlt AS FotoCompacta,
(SELECT COUNT(*) FROM Comentario C
WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta,
1 AS MATCH, A.DataAlteracao
FROM
Artigo A
JOIN
ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE
A.Apagado = 0
AND A.TAG COLLATE Latin1_General_CI_AI LIKE '%' + @Tag + '%'
AND A.CampanhaAreaId = @CampanhaAreaId
AND A.ArtigoId <> @NoticiaId
UNION
SELECT A.ArtigoId
,A.CategoriaId
,A.Titulo
,A.Conteudo
,A.Subtitulo
,C.Nome AS Categoria
,A.ImgAlt AS FotoCompacta
,(SELECT COUNT(*) FROM Comentario C WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta
,2 AS MATCH
,A.DataAlteracao
FROM Artigo A
JOIN ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE A.Apagado = 0 AND A.TAG COLLATE Latin1_General_CI_AI LIKE '%' + @Tag + '%' AND A.CampanhaId = @ExtranetId AND A.ArtigoId <> @NoticiaId
UNION
SELECT A.ArtigoId
,A.CategoriaId
,A.Titulo
,A.Conteudo
,A.Subtitulo
,C.Nome AS Categoria
,A.ImgAlt AS FotoCompacta
,(SELECT COUNT(*) FROM Comentario C WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta
,3 AS MATCH
,A.DataAlteracao
FROM Artigo A
JOIN ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE A.Apagado = 0 AND A.CampanhaAreaId = @CampanhaAreaId AND A.ArtigoId <> @NoticiaId
UNION
SELECT A.ArtigoId
,A.CategoriaId
,A.Titulo
,A.Conteudo
,A.Subtitulo
,C.Nome AS Categoria
,A.ImgAlt AS FotoCompacta
,(SELECT COUNT(*) FROM Comentario C WHERE C.GenericAreaId = A.ArtigoId) AS QtdResposta
,4 AS MATCH
,A.DataAlteracao
FROM Artigo A
JOIN ArtigoCategoria C ON A.CategoriaId = C.CategoriaId
WHERE A.Apagado = 0 AND A.CampanhaId = @ExtranetId AND A.ArtigoId <> @NoticiaId
) AS T
GROUP BY
ArtigoId
,CategoriaId
,Titulo
,Conteudo
,Subtitulo
,Categoria
,FotoCompacta
,QtdResposta
,MATCH
,DataAlteracao) AS T2
ORDER BY T2.MATCH ASC, T2.DataAlteracao DESC
END
因此,第一个查询仅返回同一TAG和Project中的文章。
第二个,返回匹配相同TAG的所有文章。
第三个,匹配同一个项目中的所有文章。
最后一篇与所有发表的文章相符。
我的真正问题,我猜,所有结果都不尊重这个顺序。
如果我有两篇文章使用相同的标签,这应该首先作为相关文章,但不知何故,这首先带来我最近更新的任何文章,不应该是列表中的第一篇。
当我尝试执行此过程时,SQL Server始终返回值为Match
的列0
。
我认为问题出在本匹配列中,我无法通过它订购。
如果有人需要更多信息,请告诉我。我会感激任何帮助。
我没有采取任何进一步行动。
答案 0 :(得分:2)
你正在做&#34; SELECT 0 AS MATCH&#34;在您的外部查询中,这意味着它会覆盖内部查询中的任何值。
换句话说,为了揭露问题,您的代码可以简化为:
SELECT 0 AS Match
FROM (
SELECT 1 AS Match
UNION
SELECT 2 AS Match
UNION
SELECT 3 AS Match
UNION
SELECT 4 AS Match
)
ORDER BY Match
由于您在内部查询中使用Match 1-4,但随后声明&#34; SELECT 0 AS Match&#34;在从内部查询中选择的外部查询中,所有行都将为0匹配。
而不是&#34; 0 AS Match&#34;在外部查询中,您应该从内部查询中获得匹配。