在Join中使用'in'

时间:2010-05-04 13:15:20

标签: sql oracle plsql

我有两个选择& 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 in(a.ids)中。但是为什么如果它看起来像12(12,24)并且没有结果:(

1 个答案:

答案 0 :(得分:2)

这不起作用,因为(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>

正如您所看到的,它返回左侧查询中的值而右侧没有任何值,原因我在上面给出了。

如果您希望在部分匹配ID的基础上从两个查询中获取内容,则需要执行以下操作:

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>

如果采用后一种方法,您可能需要考虑将外连接转换为内连接。依靠精确的业务规则。