2015-07-21 70 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