通常在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
有什么想法吗?
答案 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
。