2016-10-27 3 views
0

Я искал, но не могу найти ответ на этот вопрос, поэтому я надеюсь, что кто-то может помочь. У меня есть две таблицыSQL Join/WHERE issue

Таблица 1 (проверенные элементы)

audit_session_id asset_number 
Audit1    1  
Audit1    2  
Audit2    3  

Таблица 2 (актив)

asset_number location<br> 
1   15 
2   10 
3   15 

То, что я хочу, это таблица активов, которые появляются в таблице 2, но не в таблице 1 для данного места и audit_session_id. Что у меня есть:

SELECT a.asset_number 
FROM auditeditems ai 
RIGHT JOIN asset a 
    on ai.asset_number = a.asset_number 
WHERE ai.asset_number IS NULL 
AND a.location_id=15; 

Однако я не могу фильтровать audit_session_id как это NULL. Так что я получаю результат:

1,3, когда оно должно быть просто 1. (предполагая, что я смотрел на audit1 сессии)

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

+2

просто наблюдение: в реальном мире, RIGHT JOIN и исчезающе редки. – Strawberry

+1

Многие люди находят, что левое соединение трудно понять, и даже больше найти подходящее соединение, совершенно запутанное. Итак, мой совет - всегда делать левое соединение. Гораздо проще понять, что «главная таблица слева объединяет необязательные данные», а не «необязательные данные, правые присоединяются к основной таблице». – jarlh

+0

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

ответ

0

Я считаю, что вы хотите поставить условие в ON пункте:

SELECT a.asset_number 
FROM auditeditems ai 
    asset a LEFT JOIN 
    auditeditems ai 
    ON ai.asset_number = a.asset_number AND 
     ai.audit_session_id = 'Audit1' 
WHERE ai.asset_number IS NULL AND a.location_id = 15; 
0

У вас было шаткое соединение. Попробуйте:

select A1.* 
from Asset A1 
left join AuditedItems A2 
    on A1.asset_number = A2.asset_number 
where A1.location_id = 15 
and A2.asset_number is null 
+0

Спасибо за это, так что LEFT JOIN это, но я все еще не могу видеть, как я могу получить результаты только для определенного audit_session_id. Кажется, что этот запрос соответствует всем данным в audited_items, а не только для определенного объекта audit_session_id. – Lee

+0

@Lee Кто-то гораздо умнее меня сможет объяснить, я просто знаю, что Правый ведет себя странно в mySQL – JohnHC

0

Используйте JOIN найти конкретные активы проверяются на сессии и месте вы желаете, то «анти присоединиться к (например, с помощью NOT IN <table_epxression>), чтобы найти все другие активы:

SELECT asset_number 
    FROM asset 
WHERE asset_number NOT IN (SELECT asset_number 
           FROM asset 
            NATURAL JOIN 
            auditeditems 
           WHERE audit_session_id = 'Audit1' 
            AND location_id = 15);