Oracle查询中= +的含义是什么

时间:2011-12-30 12:34:04

标签: sql oracle plsql

通常在C ++编程语言中,加法意味着在下面的例子中添加

int x;
x += 1;

但是在plsql查询中,我对同样的用法感到困惑。这种用法并不意味着添加。在这种情况下,= +?

的含义是什么
Select c.* From alf_numeric a, run_of_id b, tail_of_st c 
WHERE category_id IN(33,36) AND a.flow_id =+ b.flow_id 

有什么想法吗?

6 个答案:

答案 0 :(得分:8)

此:

...
FROM alf_numeric a, run_of_id b 
WHERE a.flow_id = b.flow_id (+)

意味着:

...
FROM alf_numeric a
  LEFT JOIN run_of_id b 
    ON a.flow_id = b.flow_id 

我的猜测是:

a.flow_id =+b.flow_id 

被解析为(简单):

a.flow_id = (+b.flow_id)

等同于:

a.flow_id = b.flow_id  

答案 1 :(得分:4)

在我看来,'= +'的'+'部分是无操作。尝试运行以下语句:

CREATE TABLE test1 (v1 NUMBER);

INSERT INTO test1(v1) VALUES (-1);
INSERT INTO test1(v1) VALUES (1);

CREATE TABLE test2(v2 NUMBER);
INSERT INTO test2(v2) VALUES (-1);
INSERT INTO test2(v2) VALUES (1);

SELECT *
  FROM test1 t1
  INNER JOIN test2 t2
    ON (t1.v1 = t2.v2)
  WHERE t1.v1 =+ t2.v2;

返回

V1   V2
-1  -1
 1   1

因此,似乎'+'运算符没有做任何事情,它只是回答那里的任何事情。作为对此的测试,运行以下语句:

SELECT V1, +V1 AS PLUS_V1, ABS(V1) AS ABS_V1, -V1 AS NEG_V1 FROM TEST1;

你会发现它返回

V1   PLUS_V1  ABS_V1   NEG_V1
-1   -1       1         1
 1    1       1        -1

似乎证实了一元'+'实际上是无操作。

分享并享受。

答案 2 :(得分:3)

在SELECT语句中,使用

子句
a.flow_id =+b.flow_id

主要是比较。它测试a.flow_id的值是否等于b.flow_id的值。因此,在这种情况下,+运算符是处理单个操作数的算术运算符。它将值的符号转为正值。

更新

似乎我有点不对劲。操作员不会更改标志。它几乎没有效果。

答案 3 :(得分:1)

这可能是Sybase中旧的左连接语法的拼写错误,它可能是=*而不是=+。如果这是真的,您可以使用join以更清晰的方式重写查询,例如:

select  c.* 
From    alf_numeric a
left join
        run_of_id b
on      a.flow_id = b.flow_id
cross join
        tail_of_st c 
WHERE   category_id IN(33,36)

基本上会为tail_of_st中的每个条目返回整个表alf_numeric,并在category_id上设置一个过滤器(不知道它在哪个表中。)一个神秘的查询!

答案 4 :(得分:0)

在您的C ++示例中,+指定了正号,它与添加无关。就像你可以写x = -1一样,你也可以写x = +1(等于x = 1,因为+因为符号可以省略 - 并且在大多数情况下,因为它确实没有任何效果)。但这两种情况都是C ++中的赋值,而不是添加 - 不涉及实际计算;你可能会想到x += 1(顺序很重要!),这会使x增加1。

在您的SQL查询中,我认为+应该具有特殊含义 - 它可能应该indicate an outer join。虽然如果我正确阅读该文件,它实际上应该是a.flow_id = b.flow_id (+);就像在这里一样,我怀疑查询解析器会将它识别为外部联接,而只是将其解释为正号,就像在C ++示例中一样。

答案 5 :(得分:-1)

我相信这是一个连接语法的东西。标准方法是说tableA join tableB on <whatever>之类的东西,但是某些DB(例如Sybase和Oracle)支持备用语法。在Sybase中,它是=**=。 Postgres可能会做同样的事情。从格式来看,我猜一个正确的外连接,但很难说。我查看了PG文档,但没有立即看到它。

BTW,在C中你有x += 1而不是x = +1