2014-11-04 2 views
0

У меня есть два утверждения, которые я хочу объединить в один вывод.SQL Join/Union

Заявление One:

select name from auxiliary_variable_inquiry 
where inquiry_idbr_code = '063' 

Возвращает следующий список имен:

Name 
------------ 
Affiliates 
NetBookValue 
Parents 
Worldbase 

Заявление Два:

select name, value from auxiliary_variable_value 
where inquiry_idbr_code = '063' 
and ru_ref = 20120000008 
and period = 200912 

Возвращает следующее:

Name  Value 
------------------- 
Affiliates  112 
NetBookValue 225.700 

Я хотел бы иметь выход так:

Name   Value 
------------------- 
Affiliates 112 
NetBookValue 225.700 
Parents  0 
Worldbase  0 

Так в основном, если второй запрос возвращает только 2 имена и значения, я все же хотел, чтобы отобразить полный набор имен из первого запроса , без значений. Если все четыре значения были возвращены обоими запросами, все четыре будут отображаться.

Извините, что я должен добавить им использование Ingres SQL, чтобы я не смог использовать функцию ISNULL.

+0

Какая версия Ingres вы используете? IFNULL() доступен, или вы можете использовать CASE, как это делали ниже. Вероятно, $, потому что результаты возвращаются как тип MONEY. Каков тип данных Value? – PaulM

ответ

1

Я бы порекомендовал self-JOIN, используя синтаксис LEFT OUTER JOIN. Включите ваши «дополнительные» условия со второго запроса в РЕГИСТРИРУЙТЕСЬ состоянии, в то время как первые условия пребывания в WHERE, например:

select a.name, CASE WHEN b.Value IS NULL THEN 0 ELSE b.Value END AS Value 
    from 
     auxiliary_variable_inquiry a 
     LEFT JOIN 
     auxiliary_variable_inquiry b ON 
      a.name = b.name and -- replace this with your real ID-based JOIN 
      a.inquiry_idbr_code = b.inquiry_idbr_code AND 
      b.ru_ref = 20120000008 AND 
      b.period = 200912 
    where a.inquiry_idbr_code = '063' 
+0

Поврежден COALESCE() для ISNULL() – AHiggins

+0

Это замечательно, но еще раз по какой-то причине его добавить $ в столбец значений? –

+0

Вы имеете в виду, что имя столбца содержит знак $ (например, '$ Value', или что содержимое включает его (например,' $ 0')? – AHiggins

2

Вы можете сделать левое соединение. Это гарантирует, что все записи из первой таблицы останутся включенными. Если значение равно null, детская запись не найдена, и мы используем coalesce для отображения 0 в этих случаях.

select i.name, COALESCE(v.Value,0) from auxiliary_variable_inquiry i 
left join auxiliary_variable_value v 
on v.inquiry_idbr_code = i.inquiry_idbr_code 
and v.ru_ref = 20120000008 
and v.period = 200912 
where i.inquiry_idbr_code = '063' 
+0

Привет, я пробовал это, по какой-то причине его добавил $ на col2, и значения не кажутся правильными. а не просто заполнять 0 для родителей и worldbase его копирование в значениях из членских организаций и NBV –

+0

Это странно. Если вы можете воспроизвести эту проблему на http://sqlfiddle.com/, я с удовольствием рассмотрю ее. – wvdz

+0

@popovitsj, я думаю, это связано с тем, что вы ссылаетесь на значение 'query_idbr_code', которое является' 063' для всех четырех записей в примере. В JOIN необходимо включить поле «имя» (см. Мой ответ ниже - возможно, вы сможете выяснить значение $) или идентификатор, уникальный для каждой записи. – AHiggins

0

если я получил права, вы должны использовать что-то вроде:

SELECT i.NAME, 
     v.NAME, 
     v.value 
FROM auxiliary_variable_inquiry i 
     LEFT JOIN auxiliary_variable_value v 
       ON i.inquiry_idbr_code = v.inquiry_idbr_code 
WHERE v.ru_ref = 20120000008 
     AND v.period = 200912 
+0

Нико, используя элементы из вашей второй таблицы в предложении 'WHERE', фактически превращает' LEFT JOIN' в 'INNER JOIN' ... – AHiggins

+0

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