我对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语句,但我觉得我已经探索了各种解决方案,但仍然没有找到合适的解决方案。
非常感谢任何帮助。
答案 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
);
虽然将示例代码放在一个问题中非常有用,但包含样本数据和所需结果也很有帮助。这确实有助于澄清一个问题。