2015-07-21 78 views
1

我面临一个问题,即我的查询无法通过相关性排序,因为我声明'列'匹配并尝试按它排序。SQL Server 2008 - 联合4查询和按相关性排序

我试图创建一个使用UNION存储过程。

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

让我解释一下这些规则:

  1. 我需要搜索和匹配,并具有与之相关的同一个项目里面相同的标记物品(如CampanhaId
  2. 我需要搜索和匹配相同的标签,而不是同一个项目里面,但公共物品
  3. 在同一个项目中最近的文章
  4. 近期公共物品

我需要在priory中遵循这些规则,并搜索前三篇文章。

因此,如果第一条规则不具有至少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的所有文章。

第三个,匹配同一个项目中的所有文章。

最后一个匹配所有文章发布。

我真正的问题,我想,所有的结果都不尊重那个顺序。

如果我有同一个标签的两篇文章,这应该首先带来的相关文章,但不知何故,这首先使我最近更新的,不应该在列表中的第一个任何物品。

当我试图执行此过程时,SQL Server始终返回值为0的列Match

我认为这个问题出现在这个匹配列中,我不能按它排序。

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

我没有任何进一步的行动,我需要采取。

+0

它是一个SQL查询语句,不POG的编程...笑 – bcesars

回答

2

你正在做你的外部查询,这意味着它是过写在你的内部查询的任何值“SELECT 0 AS MATCH”。

换句话说,揭露问题,你的代码可以简化为这样:

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 

由于您使用的比赛1-4内查询,但随后指出“SELECT 0 AS匹配”在从内查询选择外部查询中,所有行将会有0匹配。

而是在外部查询获得“0 AS匹配”的,你应该只从内部查询得到匹配。

+0

我得到你说什么,但如果我尝试删除“选择0作为MATCH”,我的查询语句显示重复记录。我该如何解决这个问题? @TabAlleman – bcesars

+1

把它恢复原样,但不是“0 AS匹配”,而是选择“匹配”,以便从内部查询中获取值。 –

+0

不可思议。我只是这样做了你所说的,它的工作原理。由于@TabAlleman – bcesars