Sql server 2008 添加子查询-SQL Server 2008
我有以下SQL查询,但这不是我想要的:Sql server 2008 添加子查询-SQL Server 2008,sql-server-2008,tsql,Sql Server 2008,Tsql,我有以下SQL查询,但这不是我想要的: SELECT TOP (20) Attribs.ImageID AS ItemID FROM Attribs LEFT OUTER JOIN Items ON Attribs.ImageID = Items.ImageID WHERE (attribID IN ('a','b','c','d','e')) AND (deleted NOT IN (1,2)) AND Attribs.attri
SELECT
TOP (20) Attribs.ImageID AS ItemID
FROM
Attribs
LEFT OUTER JOIN
Items ON Attribs.ImageID = Items.ImageID
WHERE
(attribID IN ('a','b','c','d','e'))
AND (deleted NOT IN (1,2))
AND Attribs.attribID = 'a' AND Attribs.attribID = 'b'
GROUP BY
Attribs.ImageID
ORDER BY
COUNT(DISTINCT attribID) DESC
我需要的是质疑
AND Attribs.attribID = 'a' AND Attribs.attribID = 'b'
首先,然后是基于上述查询结果的WHERE子句的其余部分
这是否可以通过使用子查询来实现
我正在使用SQLServer2008
谢谢你你想为性能问题这样做吗?因为分解这些不会改变结果 无论如何,您可以这样做:
SELECT TOP (20) rn_Attribs.ImageID AS ItemID
FROM (SELECT *
FROM Attribs
WHERE Attribs.attribID = '123' AND Attribs.attribID = '456') rn_Attribs
LEFT OUTER JOIN Items ON rn_Attribs.ImageID = Items.ImageID
WHERE(attribID IN ('a','b','c'))
AND (deleted NOT IN (1,2))
GROUP BY rn_Attribs.ImageID
ORDER BY COUNT(DISTINCT attribID) DESC
我不完全明白你为什么要先做这一个查询,然后再做另一个。。。。但您可以使用一个公共表表达式(CTE)-类似于以下内容:
;WITH FirstQuery AS
(
SELECT a.ImageId
FROM dbo.Attribs a
WHERE a.attribID = 'a' AND a.attribID = 'b'
)
SELECT
TOP (20) a.ImageID AS ItemID
FROM
dbo.Attribs a
INNER JOIN
FirstQuery fq ON a.ImageId = fq.ImageId
LEFT OUTER JOIN
dbo.Items i ON a.ImageID = i.ImageID
WHERE
(attribID IN ('a','b','c','d','e'))
AND (deleted NOT IN (1,2))
GROUP BY
a.ImageID
ORDER BY
COUNT(DISTINCT attribID) DESC
这样,您首先从CTE中的
dbo.Attribs
表中选择ImageID
,然后将该结果集与该表的结果连接起来,并连接到项
表。如果我正确理解了您的问题,我不认为这会影响到哪个条件优先。你的搜索词是矛盾的。任何记录都不会同时具有“a”、“b”或“c”以及“123”或“456”的属性值(更不用说两者了!)。你能澄清你想做什么吗?约翰,你是对的。我更新了示例查询。我想要的是(在本例中)得到‘a’和‘b’的结果,然后得到(a,b,c,d,e)中匹配度最高的imageID。假设我有itemid1-a,c,d itemid2-a,b,c,itemid3-a,b。在这种情况下,itemID 1将不会包含在结果中,尽管它最匹配。我已更改了原始帖子(请参考上面的评论),并尝试了您的查询,但我没有得到任何结果。事实上,我的错误。。。(attridip='a')和(attridip='b')不起作用。你现在把我弄糊涂了。你的目标是什么?(attridip='a')和(attridip='b')永远不会得到任何结果。顺便说一句,你为什么要拆分这个呢?对不起,应该使用这个查询而不是attridip='a'和attridip='b'。我还在努力。。。。。选择ImageID,将(attribs.attri同上)计数为(按ImageID划分)作为attribs中的NumattRibbs,其中attribs.attribbs在('a','b'))中为a.ImageID=Items.ImageID中的左侧外部联接项,其中NumattRibbs=2I要查询,因为其中a.attribbs='a'和a.attribb='b'是ImageID必须具有的属性同上。(attrimpid IN('a','b','c','d','e')是指条件并不适用于所有人,因为它计算了其中有多少适用于图像。因此我意识到其中a.attrimpid='a'和a.attrimpid='b'不起作用。它应该是SELECT ImageID,count(attribs.attridipe)OVER(按ImageID分区)作为attribs中的Numattribs,其中attribs.attridipe位于('a','b')中)a.ImageID=Items.ImageID上的左外部联接Items,其中numattribs=2。很抱歉,在我发布问题之前,我应该捕捉到这一点。我需要的是将我在上一篇文章中的查询替换为您的内部查询“with FirstQuery AS”。你能告诉我为什么每个人都想知道为什么我要先问别人吗?这是个坏主意吗?