使用嵌套的SELECT检索多行总是返回ORA-01427(子查询返回多行)错误或缺少元素错误

时间:2014-08-11 23:19:03

标签: sql oracle

我对SQL很陌生,我知道有很多关于这个特定问题的讨论,但我所遵循的所有例子都没有产生我预期的结果。

我正在尝试检索绑定到表中单个ID的多行数据。这个数据通常有两行,所以我试图让查询返回数据,无论有多少行,然后在我的程序的其余部分显示数据。

我一直在使用TOAD来验证我的SQL语句是否真的有效,所以我先写了它们然后尝试在我一直在处理的应用程序中实现它们。

我写了三个例子,但没有一个像我预期的那样工作。在应用程序中,我试图将此查询添加到另一个程序员已经编写的现有查询中。

1)TOAD:

SELECT carid
FROM tableA
WHERE carid IN ((SELECT DISTINCT NVL(carid, 'No ID')
FROM tableA ta, tableM tm
WHERE ta.ID = tm.ID AND tm.ID = 7));       

应用程序中的QUERY:

qStr.append("SELECT carid");
qstr.append("FROM "+(String)session.getAttribute("tableA")+" ");
qStr.append("WHERE carid IN ((SELECT DISTINCT NVL(carid, 'No ID') ");
qStr.append("FROM "+(String)session.getAttribute("tableA")+" ta, "+(String)session.getAttribute("tableM")+" tm ");
qStr.append("WHERE ta.ID = tm.ID AND tm.ID = "+idString+") AS carAlias, );

上面的查询在应用程序中返回了一个MISSING EXPRESSION ERROR,我找不到我错过的内容。

同样在应用程序中,我试图为返回的值分配一个别名,以便我可以在程序中稍后操作数据。

2)TOAD:

SELECT NVL(carid, 'No ID')
FROM tableA
INNER JOIN tableM tm ON ta.ID = tm.ID
WHERE tm.ID=7;

应用程序中的QUERY:

qStr.append("(");
qStr.append("SELECT NVL(carid, 'No ID') ");
qStr.append("FROM "+(String)session.getAttribute("tableA")+" ta ");
qStr.append("INNER JOIN "+(String)session.getAttribute("tableM")+" tm ON ta.ID = tm.ID ");
qStr.append("WHERE tm.ID = "+idString+"");
qStr.append(") AS carAlias ,");

上面的查询运行并且有效,但在遇到返回多行的SELECTS时仍会抛出ORA-01427错误。

3)TOAD:

SELECT NVL(carid, 'No ID');
FROM tableA ta
JOIN tableM tm ON ta.ID = tm.ID
WHERE tm.ID = 7;

在应用程序中查询:

qStr.append("(");
qStr.append("SELECT NVL(carid, 'No ID') ");
qStr.append("FROM "+(String)session.getAttribute("tableA")+" ta ");
qStr.append("JOIN "+(String)session.getAttribute("tableM")+" tm ON ta.ID = tm.ID ");
qStr.append("WHERE tm.ID = "+idString+"");
qStr.append(") AS carAlias, ");

上面的查询是案例2的另一种变体,因此当返回多行时它仍然失败。

我知道这是一个非常简单的SELECT语句,但我觉得我已经探索了各种解决方案,但仍然没有找到合适的解决方案。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

如果我不得不猜测,如果你有一个正确的相关子查询,你的第一个版本就可以了。问题是TableA被提到两次。你在子查询中不需要它:

SELECT carid
FROM tableA ta
WHERE carid IN (SELECT NVL(tm.carid, 'No ID')
                FROM tableM tm
                WHERE ta.ID = tm.ID AND tm.ID = 7
               );

select distinct子查询不需要in。数据库知道不要担心重复值。

编辑:

你没有给出表格的布局。所以也许上面的工作没有成功,因为tm.carid并不存在。如果是这样,那么试试这个:

SELECT carid
FROM tableA ta
WHERE EXISTS (SELECT 1
              FROM tableM tm
              WHERE ta.ID = tm.ID AND tm.ID = 7
             );

虽然将示例代码放在一个问题中非常有用,但包含样本数据和所需结果也很有帮助。这确实有助于澄清一个问题。