这是一个我认为应该有效的例子,但不是:
select * from TABLE_A where KEY in (
select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824');
基本上,内部select语句返回一组带有'$$'前缀的结果。这用作TABLE_A中的查找键,它在键中不包含'$$'前缀。
如果我手动运行内部声明:
select substr(DYNAMIC_KEY,3) from TABLE_B where DYNAMIC_KEY like '$$%' and RECORD_ID='104251893783388824'
复制第一个结果,让'8462928318772288542'运行外部选择语句
select * from TABLE_A where KEY = '8462928318772288542'
这很有效。
但是,如果我运行的是select in(select ...)语句,我就没有结果。
修改:
此处使用的数据库是Oracle 10g。
TABLE_B中的DYNAMIC_KEY列是VARCHAR2
TABLE_A中的KEY列是CHAR 32
答案 0 :(得分:1)
SELECT TABLE_A.*
FROM TABLE_A a
INNER JOIN TABLE_B b ON a.KEY = b.sbustr(DYNAMIC_KEY,3)
WHERE b.DYNAMIC_KEY like '$$%' AND b.RECORD_ID='104251893783388824'
答案 1 :(得分:1)
您的问题是由TABLE_A.KEY中的数据类型“char(32)”与TABLE_B.DYNAMIC_KEY中的“varchar2”之间的比较产生的。 TABLE_A.KEY中的值由dbms空白填充到定义的大小32.
当您执行子查询并将结果复制到外部查询时,您将char(32)类型的列与文字字符串进行比较,dbms将其视为char(32)。意思是,它是空白填充的,因此比较起作用。
在原始查询中,您可以将“where KEY in (
”更改为“where trim(KEY) in (
”,然后查询就可以了。 trim()函数返回varchar2值。
答案 2 :(得分:0)
substring需要3个元素而不是2个元素。另外我怀疑key的值与子串的值不匹配。
答案 3 :(得分:0)
您是否可能需要在任一列上修剪掉拖尾空白?或者可能将它们都转换为相同的数据类型?