加入表自己

时间:2014-12-10 05:13:43

标签: sql oracle sqlplus

我试图加入一张桌子。

但是得到以下错误

SQL> select a.bookid, b.auname
2  from book_author a, book_author b
3  where a.bookid = b.auname;
where a.bookid = b.auname
             *
ERROR at line 3:
ORA-01722: invalid number

我试图加入的表是:

create table book_author
(Auname varchar2(15),
bookid number(5),

对于每个bookid,我想列出bookid和每位作者(第2列)与他/她的共同作者(column3) 我想使用BOOK_AUTHOR的虚拟副本来做到这一点。 我想要的输出看起来像这样。

Bookid       Author  Coauthor
1101         Dilbert Emerson
1101         Dilbert Sartre
1101         Emerson Dilbert
1101         Emerson Sartre
1101         Sartre  Dilbert
1101         Sartre  Emeson

    (note Dilbert Dilbert should not appear)



SQL> select * from book_author
2  order by bookid;

AUNAME              BOOKID
--------------- ----------
Emerson               1101
Sartre                1101
Dilbert               1101
Sartre                1102
Axel                  1102
Marquez               1103
Breese                1103
Young                 1104
Groom                 1104
Young                 1105
Blake                 1105
Julian                1105
Verde                 1105
Scott                 1105
Black                 1106
Sartre                1106
Simon                 2007
Emerson               2007
Pell                  2007
Rogers                2008
Sartre                2008
Codd                  2008
Young                 2008
Lamont                2010
Fellows               2011
Modiano               2011
Poe                   2222
Modiano               2222
Null                  2229

2 个答案:

答案 0 :(得分:2)

您想加入bookid上的表格,您不想将bookid(数字列)与auname进行比较(a string column)。

这样的东西
select a.bookid, a.auname, b.auname
  from book_author a, 
       book_author b
 where a.bookid = b.bookid
   and a.auname != b.auname;

答案 1 :(得分:1)

Justin Cave得到了正确答案。作为补充:ORA-01722:无效数字表示您在一个表达式中混合number和varchar列。如果您没有明确说出您想要的内容,Oracle将使用隐式转换规则。在这种情况下,Oracle会尝试将b.auname转换为数字,因为您要将其与数值进行比较。

大多数情况下,这是一个错误,但很少是你想要的。如果是这样,你应该明确说出Oracle应该做什么:

where to_char(a.bookid) = b.auname