2015-02-02 4 views
1

Это довольно много для меня. Одна из моих проблем заключается в том, что я не знаю, как сформулировать вопрос, что очевидно по названию.T-SQL - Найти отдельные значения в таблице только в том случае, если объединенные строки удовлетворяют списку критериев

Я попытаюсь проиллюстрировать мою проблему:

У меня есть таблица, A:

ID LocationID 
11 185 
12 185 
13 206 

И таблицу B:

ID AID Position Value 
1  11  1   4 
2  11  3   8 
3  11  5   4 
4  12  1   4 
5  12  2   4 
6  12  3   5 

Таблица B связан с таблицей А по ID и AID. Я хотел бы построить запрос, который имеет следующие фильтры: Position = 1 AND Value = 4 и Position = 3 AND Value = 5 и который дает мне список различных идентификаторов от A.ID, которые ставят все данных критериев.

Под этим я подразумеваю, что если я присоединяюсь к двум столам вместе с INNER JOIN, я хочу иметь только A.ID = 12.

свой старт к решению этой проблемы было что-то вдоль линий:

SELECT DISTINCT A.ID 
FROM A 
    INNER JOIN B ON (A.ID = B.AID) 
WHERE 
    A.LocationID = 185 AND 
    (B.Position = 1 AND B.Value = 4) OR 
    (B.Position = 3 AND B.Value = 5) 

который, очевидно, не работает. Я думал, что у меня есть четкое решение этого, но когда я думаю об этом, я действительно этого не делаю.

Я немного в тупике от этой проблемы, и мне сложно найти стратегию по ее решению, так как я даже не знаю, какие ключевые слова использовать в моем поиске.

ответ

1

Вы можете сделать это с GROUP BY и HAVING:

SELECT A.ID 
FROM A 
    INNER JOIN B ON (A.ID = B.AID) 
GROUP BY A.ID 
HAVING MAX(CASE WHEN A.LocationID = 185 THEN 1 END) = 1 
    AND MAX(CASE WHEN B.Position = 1 AND B.Value = 4 THEN 1 END) = 1 
    AND MAX(CASE WHEN B.Position = 3 AND B.Value = 5 THEN 1 END) = 1 

Демо: SQL Fiddle

На самом деле можно перемещать LocationID критерии WHERE:

SELECT A.ID 
FROM Table1 A 
    INNER JOIN Table2 B ON (A.ID = B.AID) 
WHERE A.LocationID = 185 
GROUP BY A.ID 
HAVING MAX(CASE WHEN B.Position = 1 AND B.Value = 4 THEN 1 END) = 1 
    AND MAX(CASE WHEN B.Position = 3 AND B.Value = 5 THEN 1 END) = 1 
0
SELECT DISTINCT A.ID 
FROM A 
WHERE A.ID IN(
    SELECT ID 
FROM B 
WHERE (B.Position = 1 AND B.Value = 4) OR 
    (B.Position = 3 AND B.Value = 5) 

) 

Если я вас понимаю правильно.

SELECT DISTINCT A.id ИЗ INNER JOIN B ON (A.ID = B.AID) ГДЕ A.LocationID = 185 И (B.Position = 1 И B.Value = 4) или (B.Position = 3 AND B.Value = 5)

0

Вы пропустили для добавления скобок.

Так выполнено ваше дело.

(A.LocationID = 185 
     AND (B.Position = 1 
       AND B.Value = 4)) 
       OR (B.Position = 3 
        AND B.Value = 5) 

AND имеет более высокий приоритет, чем OR. Попробуйте это

SELECT DISTINCT A.ID 
FROM A 
     INNER JOIN B 
       ON (A.ID = B.AID) 
WHERE A.LocationID = 185 
     AND ((B.Position = 1 
       AND B.Value = 4) 
       OR (B.Position = 3 
        AND B.Value = 5)) 

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

  • Нет связанных вопросов^_^