2013-06-05 2 views
0

Попытка вернуть список заголовков (t.processed), которые существуют в обоих MOF и SIL местах, а затем вычесть из названий этого списка, которые существуют в SILсочетающие запросов в SQL

После доработки:

select t.processed, i.call 
from item i, title t 
where i.bib# = t.bib# 
    and i.collection = 'PIC' 
    and i.location in ('MOF', 'SIL') 
except 
select t.processed, i.call 
from item i, title t 
where i.bib# = t.bib# 
    and i.collection = 'PIC' 
    and i.location = 'SIL' 

к сожалению, это не возвращает никаких результатов, но немного ближе к тому, что мне нужно

Пример вывода достаточно прост (и гибкий):

processed  call 
Mouse count  P WAL 
Fly away home P BUN 

Дальнейшие уточнения: Я хотел бы найти названия (например. Летите домой), которые повторяются в обоих местах SIL и MOF, а затем удалить из этого списка названия, которые происходят в месте СИЛ

+4

Не делает ваш второй запрос? – DaveRlz

+0

Кажется, что ваш второй запрос должен дать вам то, что вы хотите. Если вы хотите обоим, тогда 'AND (i.location = 'STL' ИЛИ ​​i.location = 'MOF')' должен работать –

+0

Вопрос заключается в запросе продуктов, находящихся в MOF, а не в SIL, а не для объединения два. – Joe

ответ

0

Оператор EXCEPT делает это, для некоторых разновидностей SQL, по крайней мере:

select i.item#, t.processed, i.call, i.collection 
from item i, title t 
where i.bib# = t.bib# 
    and i.collection = 'PIC' 
    and i.location = 'MOF' 
except 
select i.item#, t.processed, i.call, i.collection 
from item i, title t 
where i.bib# = t.bib# 
    and i.collection = 'PIC' 
    and i.location = 'SIL' 
+3

Что добавляет вторая часть этого запроса, в первом наборе нет SIL, поэтому нет необходимости исключать какие-либо из них! – DaveRlz

+1

Учитывая, что исходные данные имеют несколько строк для i.bib #, которые могут иметь разные местоположения; так что это возвращает строки, которые имеют элементы в MOF, но не также в SIL. – Joe

+0

Договор Джо справедлив. Однако это все еще не совсем то, что я ищу. – Marc

0

Попробуйте

select i.item#, t.processed, i.call, i.collection 
from item i, title t 
where i.bib# = t.bib# 
    and (
     (i.collection = 'PIC' and i.location <> 'SIL') 
     or (i.collection = 'PIC' and i.location = 'MOF') 
     ) 
+0

Это будет включать все MOF и все, что не является SIL, которое было бы MOF, ABC, XYZ и т. Д. Не то, что требуется methinks (редактировалось после моего исходного комментария!) – DaveRlz

+0

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

+0

Я скорректировал его, чтобы вернуть список элементов _all, находящихся в i.location 'MOF', но не в i.location 'SIL'_, как указано в вопросе – Ram

1

Предполагая, что товар является чем-то вроде

ID Item Collection Location 
1 1 PIC  MOF 
2 1 PIC  SIL 
3 2 PIC  MOF 
4 3 PIC  SIL 

, то

Select select mof.item#, mof.call, mof.collection From Item mof 
Left Join Item sil On mof.Item# = sil.Item# and sil.Collection = mof.Collection 
Where sil.Location = 'SIL' 
and mof.Location = 'MOF' 
and mof.Collection = 'PIC' 
and sil.ID is null 

поможет вам сблизиться. Стоп со старым присоединиться к синтаксису ...

0

FINAL EDIT:

Это будет запрос я искал (мои извинения за не объясняя себя адекватно)

select t.processed 
from title t, item i 
where t.bib# = i.bib# 
and i.location = 'MOF' 
and i.collection = 'PIC' 
and i.bib# not in (select bib# from item where location = 'SIL' and collection = 'PIC') 

Я до сих пор возникают проблемы обертывая мою голову вокруг подзапросов. Моя проблема заключалась в том, что в качестве основы для подзапроса не использовался первичный ключ i.bib#.

Спасибо всем за ваши предложения!

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