Использование «в» в Join - PullRequest
2 голосов
/ 04 мая 2010

У меня есть два выбора a & b, и я присоединяюсь к ним как

select * from 
(
   select n.id_b || ',' || s.id_b ids, n.name, s.surname 
   from names n, 
        surnames s where n.id_a = s.id_a
) a 
left join
(
    select sn.id, sn.second_name
) b on b.id in (a.ids)

в этом случае объединение не работает :( Проблема в b.id в (a.ids) . Но почему, если оно выглядит как 12 в (12,24), а результата нет:

1 Ответ

2 голосов
/ 04 мая 2010

Это не сработает, потому что (12,24) - это отдельная дискретная строка, а не разделенный запятыми набор чисел. Ясно, что 12 != '(12,24)', следовательно, результаты не возвращаются.

редактировать

Я пропустил внешнее объединение в вашем опубликованном запросе. Таким образом, вы должны вернуть что-то , даже если между двумя таблицами нет соединения. Вот некоторые тестовые данные:

SQL> select * from names
  2  /

      ID_A       ID_B NAME
---------- ---------- ----------
         1         12 SAM

SQL> select * from surnames
  2  /

      ID_A       ID_B SURNAME
---------- ---------- ----------
         1         24 I-AM

SQL> select * from whatever
  2  /

        ID SECOND_NAM
---------- ----------
        24 I AM SAM

SQL>

Мой запрос похож на ваш, за исключением того, что я приведу b.id в виде строки, потому что a.ids - это строка. Если я этого не сделаю, запрос завершится с ORA-1722: invalid number.

SQL> select * from
  2      (
  3           select n.id_b || ',' || s.id_b ids, n.name, s.surname
  4           from names n,
  5                surnames s
  6           where n.id_a = s.id_a
  7      ) a
  8  left join
  9      (
 10          select sn.id, sn.second_name
 11          from whatever sn
 12      ) b on to_char(b.id) in (a.ids)
 13  /

IDS        NAME       SURNAME            ID SECOND_NAM
---------- ---------- ---------- ---------- ----------
12,24      SAM        I-AM

SQL>

Как вы можете видеть, он возвращает значения из левого запроса и ничего из правого по причине, которую я привел выше.

Если вы хотите получить что-то из обоих запросов на основе частичного совпадения идентификаторов, вам нужно сделать это:

SQL> select a.ids
  2         , a.name
  3         , a.surname
  4         , b.id
  5         , b.second_name
  6  from
  7      (
  8           select n.id_b || ',' || s.id_b ids
  9                  , n.name
 10                  , s.surname
 11                  , n.id_b as n_id_b
 12                  , s.id_b as s_id_b
 13           from names n,
 14                surnames s
 15           where n.id_a = s.id_a
 16      ) a
 17  left join
 18      (
 19          select sn.id, sn.second_name
 20          from whatever sn
 21      ) b on (b.id = a.n_id_b or b.id = a.s_id_b )
 22  /

IDS        NAME       SURNAME            ID SECOND_NAM
---------- ---------- ---------- ---------- ----------
12,24      SAM        I-AM               24 I AM SAM

SQL>

Если вы выберете этот последний подход, вы можете подумать о том, чтобы превратить внешнее соединение во внутреннее. Зависит от вас точное бизнес-правило.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...