以前,我偶然发现甲骨文中有一件有趣的事情 - Oracle: ORA-01722: invalid number。事实证明这是Oracle的自然行为(尽管与我之前处理的其他主要数据库不同--MySQL,Postgres和SQLite)。但现在我看到另一个违反直觉的事情 - 我有一个非常简单的查询,它返回shell中的结果,但是没有从Python代码中返回任何内容。这是查询:
SELECT * FROM TEST_TABLE T0
INNER JOIN TEST_TABLE_2 T1 ON T1.ATTR=T0.ID
INNER JOIN TEST_TABLE_3 T2 ON T2.ID = T1.ID
正如您所看到的,这是一个非常简单的查询,只有两个简单的连接。这是伏都教魔术截屏:
因此,正如您在shell中看到的那样,它返回数据。这是幽灵的另一张照片:
现在你看到在Python代码中它什么也没有返回。但是,如果我们稍微调整一下这个查询,它确实会返回 - 只需删除第二个连接:
那么,这有什么问题呢?我怎么能相信Oracle? (现在我觉得我可以更多地依赖像SQLite这样的文件数据库,然后依赖Oracle)。
修改
以下是包含数据的架构:
SQL> SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TEST_TABLE';
COLUMN_NAME
------------------------------
DATA_TYPE
------------------------------
ID
NUMBER
SQL> SELECT * FROM TEST_TABLE;
ID
----------
1
SQL> SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TEST_TABLE_2';
COLUMN_NAME
------------------------------
DATA_TYPE
------------------------------
ID
NUMBER
TXT
VARCHAR2
ATTR
NUMBER
SQL> SELECT * FROM TEST_TABLE_2;
ID
----------
TXT
-----------------------------------
ATTR
----------
2
hello
1
SQL> SELECT COLUMN_NAME, DATA_TYPE FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'TEST_TABLE_3';
COLUMN_NAME
------------------------------
DATA_TYPE
------------------------------
ID
NUMBER
SQL> SELECT * FROM TEST_TABLE_3;
ID
----------
2
修改
更确切地说,我用这些陈述创建了我的三个表:
CREATE TABLE test_table(id number(19) default 0 not null)
CREATE TABLE test_table_2(txt varchar(255),id number(19) default 0 not null,attr number(19) default 0 not null)
CREATE TABLE test_table_3(id number(19) default 0 not null)