我有两个选择& 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)并且没有结果:(
答案 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>
如果采用后一种方法,您可能需要考虑将外连接转换为内连接。依靠精确的业务规则。