2014-04-11 2 views
0

У меня есть два SQL-запросов (которые оба работают независимо друг от друга), что я пытаюсь совместить:Объединение двух запросов SQL в один

Query # 1:

select 
    N1."DateAndTime", 
    N0."Ration" 
from 
    (("dbo"."AnimalFeedDailyConsumption" N0 
inner join 
    "dbo"."AnimalHistoricalData" N1 on (N0."OID" = N1."OID")) 
left join 
    "dbo"."BasicAnimal" N2 on (N1."BasicAnimal" = N2."OID")) 
where 
    (N1."LactationNumber" = 4) and (N1."GCRecord" is null and (N2."Number" = 511)) 

Query # 2:

select 
    N2."Number", 
    N1."DIM", 
    N1."DateAndTime", 
    N1."LactationNumber", 
    N0."TotalYield" 
from 
    (("dbo"."DailyMilk" N0 
inner join 
    "dbo"."AnimalHistoricalData" N1 on (N0."OID" = N1."OID")) 
left join 
    "dbo"."BasicAnimal" N2 on (N1."BasicAnimal" = N2."OID")) 
where 
    (N1."LactationNumber" = 4) and (N1."GCRecord" is null and (N2."Number" = 511)) 

Я попробовал это что привело к нулям для '': Ration

select 
    N2."Number", 
    N1."DIM", 
    N1."DateAndTime", 
    N1."LactationNumber", 
    N0."TotalYield", 
    N3."Ration" 
from 
    (("dbo"."DailyMilk" N0 
inner join 
    "dbo"."AnimalHistoricalData" N1 on (N0."OID" = N1."OID")) 
left join 
    ("dbo"."AnimalFeedDailyConsumption" N3 
inner join 
    "dbo"."AnimalHistoricalData" N1 on (N3."OID" = N1."OID")) 
left join 
    "dbo"."BasicAnimal" N2 on (N1."BasicAnimal" = N2."OID")) 
where 
    (N1."LactationNumber" = 4) and (N1."GCRecord" is null and (N2."Number" = 511)) 

Итак, я попытался это, который также привел к нулям для «» Ration:

select 
    N2."Number", 
    N1."DIM", 
    N1."DateAndTime", 
    N1."LactationNumber", 
    N0."TotalYield", 
    N3."Ration" 
from 
    (("dbo"."DailyMilk" N0 
inner join 
    "dbo"."AnimalHistoricalData" N1 on (N0."OID" = N1."OID")) 
left join 
    "dbo"."AnimalFeedDailyConsumption" N3 on (N3."OID" = N1."OID") 
left join 
    "dbo"."BasicAnimal" N2 on (N1."BasicAnimal" = N2."OID")) 
where 
    (N1."LactationNumber" = 4) and (N1."GCRecord" is null and (N2."Number" = 511)) 

ответ

0

Это трудно ответить, потому что я не знаю, отношения между вашими таблицами. В ваших «рабочих» запросах вы проверяете условия в таблице RIGHT (N2), к которым вы присоединились к LEFT OUTER, потому что это необязательно - возможно, это правильно, но выглядит неправильно.

Как об этом, со всеми присоединяется преобразуются в внутренние соединения ?:

select 
    N2."Number", 
    N1."DIM", 
    N1."DateAndTime", 
    N1."LactationNumber", 
    N0."TotalYield", 
    N3."Ration" 
from "dbo"."DailyMilk" N0 
inner join "dbo"."AnimalHistoricalData" N1  on N0."OID" = N1."OID" 
inner join "dbo"."AnimalFeedDailyConsumption" N3 on N3."OID" = N1."OID" 
inner join "dbo"."BasicAnimal" N2    on N1."BasicAnimal" = N2."OID" 
where N1."LactationNumber" = 4 
and N1."GCRecord" is null 
and N2."Number" = 511 

Стиль Комментарий: BTW сложно (для меня), чтобы понять, какая таблица является N0, N1, N3 & N3. Почему бы не назвать их BA, AHD, DM и AFDC? Кроме того, слишком много (избыточных) брекетов.

Примечание: Я не могу проверить это, так как у меня нет ваших таблиц или данных. Как насчет создания SQLfiddle?

+0

Спасибо Turophile. Когда все соединения соединяются как внутренние, запрос не возвращает никаких ошибок, но также и никаких данных. Желаю, чтобы я мог создать SQLfiddle, но база данных массивная, не была создана мной, и я просто новичок в sql. –

+0

Ну, запрос, который я предоставил, будет возвращать все в таблицах, относящихся к объединениям, но отфильтрованных условиями 'WHERE'. Итак, попробуйте запустить запрос с удаленным одним условием, затем с удалением одного из других условий и т. Д., Чтобы узнать, какое влияние оказывает каждое условие. Вы можете сделать то же самое с каждой таблицей - если одно из соединений неверно и не приводит к совпадениям - так я бы отлаживал запрос. Также просмотрите данные своих таблиц и вручную проверите каждое из соединений, чтобы убедиться, что OID в одном - это тот же OID в другом. – Turophile

+0

Обратите внимание, что если 'OID' находится в трех таблицах, он должен быть только PK в одном - остальные два будут FK и поэтому не уникальны. – Turophile