SQL Server 2008 - 4个查询的联合和按相关性排序

时间:2015-07-21 16:05:30

标签: sql sql-server sql-server-2008

我遇到一个问题,我的查询无法按相关性排序,因为我声明了'column'MATCH并尝试按顺序排序。

我正在尝试使用UNION创建存储过程。

此查询有一些我需要遵循的规则,因为我需要带3篇相关文章。每个规则都有一个我试图将它们联合起来的查询。

让我解释一下这些规则:

  1. 我需要在同一个项目中搜索并匹配与其相关的TAG相关的文章(如CampanhaId
  2. 我需要搜索和匹配相同的TAG,而不是在同一个项目中,而是公共文章
  3. 同一项目的近期文章
  4. 最近的公开文章
  5. 我需要在修道院中遵循这些规则并搜索当时经过的前三篇文章。

    因此,如果第一条规则至少没有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

    我认为问题出在本匹配列中,我无法通过它订购。

    如果有人需要更多信息,请告诉我。我会感激任何帮助。

    我没有采取任何进一步行动。

1 个答案:

答案 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;在外部查询中,您应该从内部查询中获得匹配。