我面臨一個問題,即我的查詢無法通過相關性排序,因爲我聲明'列'匹配並嘗試按它排序。SQL Server 2008 - 聯合4查詢和按相關性排序
我試圖創建一個使用UNION
存儲過程。
此查詢有一些我需要遵循的規則,因爲我需要帶3條相關文章。每條規則都有一條查詢,我試圖將它們聯合起來。
讓我解釋一下這些規則:
- 我需要搜索和匹配,並具有與之相關的同一個項目裏面相同的標記物品(如
CampanhaId
) - 我需要搜索和匹配相同的標籤,而不是同一個項目裏面,但公共物品
- 在同一個項目中最近的文章
- 近期公共物品
我需要在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
。
我認爲這個問題出現在這個匹配列中,我不能按它排序。
如果有人需要更多信息,請告訴我。我將不勝感激任何幫助。
我沒有任何進一步的行動,我需要採取。
它是一個SQL查詢語句,不POG的編程...笑 – bcesars