2012-04-19 3 views
0

я следующий SQL-запрос, но это не совсем то, что я хочу:Добавление к югу запрос - SQL Server 2008

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, основанный на результатах запроса.

Можно ли достичь использования подзапроса?

Я использую SQL Server 2008

Спасибо

+0

Если я правильно понял ваш вопрос, я не думаю, что это имеет значение, какое условие имеет приоритет. – deutschZuid

+0

Ваши поисковые запросы противоречивы. Никакая запись не будет иметь значение для атрибута attribID, который является как «a», «b», так и «c», а также «123» или «456» (не говоря уже об обоих!). Можете ли вы уточнить, что вы пытаетесь сделать? –

+0

Joh, Вы правы. Я обновил образец запроса. Я хочу (в данном случае) получить результаты «a» и «b», а затем получить идентификатор изображения, который имеет самый соответствующий атрибут attribID в (a, b, c, d, e). Допустим, у меня есть itemID 1-a, c, d itemID 2-a, b, c, itemID 3-a, b. В этом случае itemID 1 не будет включен в результаты, хотя он имеет наибольшее совпадение. – shinya

ответ

0

я полностью не получаю причину, почему вы хотите это сделать один запрос первый перед другим .... но вы можете использовать Общие Таблица Выражение (КТР) - что-то вроде этого:

;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 

с этим, вы первый выберите ImageID из вашего dbo.Attribs таблицы в КТР, а затем присоединиться этот результат устанавливается с результатом таблицы и присоединяется к таблице Items.

+0

Я хотел бы запросить, потому что WHERE a.attribID = 'a' AND a.attribID = 'b' - атрибут attribID, который должен иметь идентификатор изображения. (attribID IN ('a', 'b', 'c', 'd', 'e')) - это условие не относится ко всем, поскольку оно подсчитывает, сколько из них относится к ImageID – shinya

+0

. Также я понял, что WHERE a.attribID = 'a' AND a.attribID = 'b' не работает. Это должен быть SELECT ImageID, count (attribs.attribID) OVER (раздел BY imageID) AS Numattribs FROM атрибуты WHERE attribs.attribID IN ('a', 'b')) LEFT OUTER JOIN Элементы ON a.ImageID = Items.ImageID WHERE numattribs = 2. Простите, я должен был поймать это, прежде чем ставить вопрос. – shinya

+0

Похоже на замену моего запроса в предыдущем посте вашим запросом внутри «WITH FirstQuery AS» - это то, что мне нужно. Не могли бы вы рассказать мне, почему все задаются вопросом, почему я хочу сначала запросить запрос перед другим? Это плохая идея? – shinya

0

Вы хотите сделать это для проблем с производительностью? Поскольку разделение этого не изменит результаты.

Во всяком случае, вы можете сделать это, как:

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 
+0

Я поменял оригинальный пост (см. Комментарии выше) и попробовал ваш запрос, но я не получаю никаких результатов. – shinya

+0

Искренне, мой плохой ... (attribID = 'a') И (attribID = 'b') не работает – shinya

+0

Теперь вы меня путаете. Какова ваша цель? (attribID = 'a') AND (attribID = 'b') никогда не может получить никакого результата. И кстати, почему вы все равно хотите разбить это? – YvesR

Смежные вопросы