Sql 什么是=+;Oracle查询中的平均值 通常在C++编程语言中,加法表示加法,在下面的例子 int x; x += 1;

Sql 什么是=+;Oracle查询中的平均值 通常在C++编程语言中,加法表示加法,在下面的例子 int x; x += 1;,sql,oracle,plsql,Sql,Oracle,Plsql,然而,在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 有什么想法吗?我认为这是一种连接语法。标准的方法是在上说一些类似于tableajointtableb的话,但是一些数据库,例如Sybase和Oracle支持替代语法

然而,在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 

有什么想法吗?

我认为这是一种连接语法。标准的方法是在上说一些类似于
tableajointtableb的话,但是一些数据库,例如Sybase和Oracle支持替代语法。在Sybase中,它是
=*
*=
。博士后可能也会这样做。从格式上看,我猜是一个正确的外部连接,但很难说。我查看了PG文档,但没有立即看到它


,在c中,你有<代码> x+=1 < /COD>不<代码> x= + 1 .< /P> < P>在C++实例中,<代码> +/>代码指定正号,它与加法无关。正如你可以写
x=-1
,你也可以写
x=+1
(这等于
x=1
,因为
+
作为符号可以省略,而且在大多数情况下,因为它实际上没有任何效果)。但这两种情况都是C++中的赋值,而不是加法——没有实际的计算涉及;您可能正在考虑
x+=1
(顺序很重要!),这将使
x
增加1

在您的SQL查询中,我认为
+
应该有一个特殊的含义-它可能应该有。虽然如果我正确阅读了该文档,它实际上应该是
a.flow\u id=b.flow\u id(+)
;就在这里,我怀疑查询分析器会把它认作外部连接,而只是把它解释成一个正符号,就像在C++例子中一样。

< P>:

...
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  

在SELECT语句中,子句

a.flow_id =+b.flow_id
主要是比较。它测试
a.flow\u id
的值是否等于
b.flow\u id
的值。因此,本例中的
+
运算符是处理单个操作数的算术运算符。它将值的符号变为正值

更新:


看来我有点错了。接线员没有改变标志。它基本上没有效果。

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

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
这似乎证实了一元“+”实际上是一个no-op


共享和享受。

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

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)

它基本上会为
alf\u numeric
中的每个条目返回整个表
tail\u of st
,并在
category\u id
上设置一个过滤器(不确定它在哪个表中)。一个神秘的查询

我想那是
=(+)
,但我现在无法检查。。。我怀疑这个问题有一个一元加号,很像a.age=-b.years,不,这不是一个赋值。你不能在SELECT语句中分配任何东西,或者在Calux.C.仍然谈论C++代码,我说它是一个附件;“这两种情况”都应该是指x= 1和x= 1,但是你是对的,这很容易被混淆到引用到C++ + SQL中,我会尝试改进它的措辞……不,连接语法将是:<代码> A.FuffyID(+)= B.FuffyId < /Cord>。请注意括号和运算符的不同位置。Postgres使用ANSI
左外连接
语法,而不是像Oracle(
(+)
)或MS SQL Server/Sybase(
=*
)这样的专有运算符。我知道Postgres支持ANSI语法。但这并不意味着它不支持任何其他功能。请详细说明:
(+)
是Oracle的(旧的)外部联接语法。但是OP在查询中有一个
=+
@这很接近,但不正确。如果值为负数,
+
运算符会更改该值的符号。@Codo:您的意思是
+某物
实际上意味着
ABS(某物)
?这当然很奇怪。@Codo:
+
操作符在哪里做这样的事情?在我所知道的任何语言中,尤其是C++和MS(SQL),它在Oracle?@ YerCube上的行为是这样的:不,你说得对。接线员没有改变标志。它没有效果。id不是负数。你的两个代码示例都很奇怪:C/C++代码没有正确初始化变量
x
。SQL查询用表
tail\u of \u st
构造一个笛卡尔乘积,这很少是您想要的。这些只是糟糕的示例还是某些工作软件的一部分?Oracle中旧的外部联接语法不是
=*
,而是
a.field(+)=b.field
a.field=b.field(+)
没错,
=*
是旧的Sybase语法,经过编辑。已经对你的答案投了赞成票,添加此选项以添加可能的解释。除此之外,+键与=键位于同一按钮上:)
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)