2013-10-25 4 views
2

У меня есть запрос, который я должен изменить, чтобы удовлетворить некоторые новые характеристики:Как решить эту проблему с помощью SQL?

Большая фотография этого запроса ниже:

enter image description here

У меня есть несколько ВНУТРЕННЕГО JOINS которые составляют результирующий набор INNER JOINS, тогда этот результирующий набор равен LEFT JOINED с A1 сначала, затем во-вторых с SCH. Это текущее состояние запроса.

Теперь, что я должен сделать, это добавить anoter result set, A2 который для common part of A1 and A2 (желтой части), чтобы отобразить записи с текущими условиями в GROUP BY.

Моя проблема заключается в том, что мне еще нужно отобразить НЕКОТОРЫЕ записи в синей области (которые являются общими для исходного набора, но не являются общими для нового набора, который я добавляю).

Я не знаю, как я могу отменить записи, которые находятся в синей области, и отфильтровать их (выберите те, которые соответствуют только одному условию), без фильтрации записей с A2. Я не знаю, какой JOIN использовать для A2 (думаю, я должен использовать INNER JOIN, но я не уверен, поэтому на моей диаграмме есть отметка ?).

FILTER blue -> ALL yellow

+2

Изображения запроса? Это что-то новое в SQL. Но мы предпочитаем традиционные методы: схема, образцы, ожидаемые результаты и фактические результаты. –

+0

Вам, вероятно, потребуется левое соединение, но можете ли вы показать несколько строк каждой из четырех таблиц и ожидаемого результата? –

+0

@AlmaDoMundo Я знаю, что вы имеете в виду, и я согласен с вами, но, к сожалению, это все, что я могу предоставить. Отображение всего запроса и всех других деталей, которые я знаю в «традиционном» вопросе, помогло бы, в этом случае мне потребовалось бы всего 1 час, чтобы изменить (форматировать) запрос, полчаса, чтобы вы поняли запрос и для меня, чтобы объяснить, и, к сожалению, это немного срочно для меня. Пожалуйста, поймите и не ненавидите. –

ответ

3

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

SELECT your,fields 
FROM (table/subquery) 
WHERE keyfield 
IS NOT IN (table/subquery) 

выбрать синюю часть данных

+0

+1 Это довольно приятное резюме о том, как это сделать, учитывая нехватку предоставленной информации :-) –

+0

Собственно, я сомневаюсь. По крайней мере, потому что на картинке есть две области, в то время как в состоянии есть только одна таблица исключений –

+0

Да, это предварительно сделано в одном запросе, это моя проблема. В противном случае я бы сделал это так же, как вы предлагали, с помощью UNION между моим исходным запросом и вашим. –

2

Согласно диаграмме вы хотите что-то вроде этого:

SELECT * FROM InnerJoins -- whatever the previous inner joins are 
INNER JOIN A1 ON A1.Key = InnerJoins.Key 
INNER JOIN SCH ON SCH.Key = InnerJoins.Key 
-- Do all inner joins up to here 
-- the statement up to here includes the blue and yellow areas only 
LEFT OUTER JOIN A2 ON A2.Key = InnerJoins.Key 
-- this still includes the blue and yellow areas combined 
WHERE A2.Key IS NULL 
-- now we are excluding the yellow area as we are asking for the bits where we have no match in A2. 
Смежные вопросы