【发布时间】:2013-12-04 11:39:39
【问题描述】:
所以我在尝试对数据表执行嵌套选择时遇到了一点问题。
我在多个图书馆拥有大量书籍。每本书都有一个 ID,每个位置都有一个名称。每次出书或还书时,都会在事务表上记录一笔交易。
表格看起来有点像这样:
+---------+--------+----------+------------+
| BOOK_ID | IN_OUT | LOCATION | DATE |
+---------+--------+----------+------------+
| B01 | O | RED | 2013-10-04 |
| B02 | O | BLUE | 2013-10-04 |
| B01 | I | RED | 2013-10-19 |
| B01 | O | RED | 2013-10-20 |
| B02 | I | RED | 2013-10-21 |
| B01 | I | BLUE | 2013-10-24 |
+---------+--------+----------+------------+
(谢谢,@Senseful!)
现在,我可以显示所有交易及其 in_time、out_time 成对显示:
SELECT i.BOOK_ID
,(SELECT MAX(o.DATE)
FROM TRANSACTIONS o
WHERE (o.IN_OUT = 'O')
AND o.BOOK_ID = i.BOOK_ID
AND o.DATE < i.DATE
) AS out_time
, i.DATE AS in_time
, LOCATION
FROM TRANSACTIONS i
WHERE i.IN_OUT = 'I'
ORDER BY i.DATE
;
但是,现在我只想显示书籍被退回到不同位置的交易:所以在上面的示例中,我尝试选择 LOCATION 作为 out_location 以添加 WHERE 子句来检查是否它等于 in_location。
很公平:
,(SELECT MAX(o.DATE), LOCATION as out_location
FROM TRANSACTIONS o
没有办法。 “ORA-00913: too many values”。
对于像这样限制输出的最明智的方法有什么想法吗?
【问题讨论】:
-
您可以使用分析函数获得结果。以这个问题为例:stackoverflow.com/questions/17824432/…
-
您可以将
AND o.location <> i.location添加到您的内部选择中,但这不会为您提供图书的当前位置。 -
@SQB 对,这看起来更有希望......评估正确,如预期的那样在
out_time上给我一个(null)。虽然在外部选择上添加where ... out_time is not null会给出ORA-00904: "i"."out_time": invalid identifier- 那么不会'看到' out_time 列吗?