Sql 什么是=+;Oracle查询中的平均值 通常在C++编程语言中,加法表示加法,在下面的例子 int x; x += 1;
然而,在plsql查询中,我对相同的用法感到困惑。这种用法并不意味着添加。在这种情况下,=+的含义是什么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支持替代语法
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)