【发布时间】:2012-01-29 23:57:08
【问题描述】:
我在我们的一个旧应用程序中遇到了一些看起来很奇怪的 Oracle 语法,我很感兴趣...
查询
(名称已更改以保护无辜者)
SELECT COUNT(1) AS WEEKLYCOUNT
FROM MONKEYS MD
WHERE
MD.MID||'' IN
(
SELECT DISTINCT MD.MID
FROM MONKEYS MD, GIRAFFES GD
WHERE
(MD.MID = GD.MID(+)||'')
AND CURRENT_STATUS = 'Healthy'
AND GIRAFFE_TYPE = 'Long-necked'
AND INTERESTING_DATE BETWEEN
'22 December 2011' AND '29 December 2011'
)
HAVING COUNT(MD.MID) > 0
我不确定的是||'' 语法。我只见过|| 在Oracle 中用于连接,直到现在。而且这里似乎没有意义......
任何关于它在做什么、为什么这样做以及这个语法是如何工作的想法都会很棒。
更多信息
有趣的是,这个 SQL 在 SQLPlus 中返回以下内容:
no rows selected
Elapsed: 00:00:00.03
SQL>
我重新编写了相同的 SQL(减去奇怪的语法),利用我对系统的了解产生了我相当确定的相同结果:
SELECT COUNT(1) AS WEEKLYCOUNT
FROM
MONKEYS MD
LEFT JOIN GIRAFFES GD ON GD.MID = MD.MID
WHERE
AND MD.CURRENT_STATUS = 'Healthy'
AND GD.GIRAFFE_TYPE = 'Long-necked'
AND GD.INTERESTING_DATE BETWEEN
'22 December 2011' AND '29 December 2011'
但是,第二个查询会产生(预期的)以下内容:
WEEKLYCOUNT
-----------
0
Elapsed: 00:00:00.16
SQL>
主要区别在于,即使两个查询都在寻找 COUNT,第一个查询也不返回任何行...很奇怪,是吧?
(PS要显示经过的时间,我有SET TIMING ON)
【问题讨论】:
标签: oracle join syntax plsql sqlplus