Sql server 2008 添加子查询-SQL Server 2008

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

我有以下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.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”。你能告诉我为什么每个人都想知道为什么我要先问别人吗?这是个坏主意吗?