Слева Объединяет ссылки на несколько строк, возвращая только одну - PullRequest
0 голосов
/ 14 декабря 2009

Я пытаюсь соединить две таблицы (назовите их table1 и table2), но возвращаю только 1 запись для каждого совпадения. В таблице 2 есть столбец с именем 'current', который является 'y', 'n' или 'null'. Я соединил две таблицы и поставил условие where, чтобы получить экземпляры 'y' и 'null', это легко. Мне нужна помощь, чтобы получить строки, которые соединяются со строками, которые имеют только 'n', чтобы вернуть один экземпляр 'none' или 'null'. Вот пример

table1 ID
1
2
3

table2
ID | table1ID | тока
1 | 1 | у
2 | 2 | нуль
3 | 3 | п
4 | 3 | п
5 | 3 | n

Мой текущий запрос присоединяется к table1.ID = table2.table1ID, а затем содержит предложение where (где table2.current = 'y' или table2.current = 'null'), но это не работает, когда нет y ', а значение не равно нулю.

Может кто-нибудь придумать запрос, который бы присоединился к таблице, как у меня, но получил бы все 3 записи из таблицы1, как это?

Запрос возврата

ID | table2ID | тока
1 | 1 | у
2 | ноль | пустой
3 | 3 | ноль или нет

Ответы [ 3 ]

1 голос
/ 14 декабря 2009

Прежде всего, я предполагаю, что "нулевые" значения на самом деле являются строками, а не значением БД NULL. Если это так, то этот запрос, приведенный ниже, должен работать (обратите внимание на включение критерия where ВНУТРИ подпункта ON)

select 
table1.ID as ID
,table2.ID as table2ID
,table2.current 
from table1 left outer join table2 
on (table2.table1ID = table1.ID and 
(table2.current in ('y','null'))

Если это сработает, я НАСТОЯТЕЛЬНО рекомендую изменить строковое значение «null» на что-то другое, поскольку оно вводит в заблуждение ... вы или какой-либо другой разработчик потеряете время на отладку этого в будущем.

Если значение «null» в точности относится к нулевому значению, измените приведенный выше запрос на:

select 
table1.ID as ID
,table2.ID as table2ID
,table2.current 
from table1 left outer join table2 
on (table2.table1ID = table1.ID and 
(table2.current = 'y' or table2.current is null))
0 голосов
/ 14 декабря 2009
select t1.id
     , t2.id
     , case when t2.count_current > 0 then
           t2.count_current 
       else
           null
       end as current
from table1 t1
left outer join
(
  select id
  , max(table1id)
  , sum(case when current = 'y' then 1 else 0 end) as count_current
  from table2
  group by id
) t2
on t1.id = t2.table1id

хотя, как указал justsomebody, это может не сработать, как вы ожидаете, если в вашей таблице 2 строки с 'y'.

0 голосов
/ 14 декабря 2009

вам нужно решить, какую из трех строк из таблицы2 с table1id = 3 вы хотите:

3 | 3 | n
4 | 3 | n
5 | 3 | n

какой критерий?

...