Oracle SQL:在语句中多次使用以前的结果

Oracle SQL:在语句中多次使用以前的结果,sql,oracle,Sql,Oracle,我想实现这样的目标: SELECT col1,col2-(SELECT foo FROM table1) FROM table2 WHERE col2>(SELECT foo FROM table1) SELECT s.col1, s.col2 - s.foo FROM ( SELECT col1, col2, (SELECT foo FROM table1) as foo FROM table2 ) s WHERE s.col2 > s.foo 不选

我想实现这样的目标:

SELECT col1,col2-(SELECT foo FROM table1) 
FROM table2 
WHERE col2>(SELECT foo FROM table1)
SELECT
    s.col1, s.col2 - s.foo
FROM
(
    SELECT col1, col2, (SELECT foo FROM table1) as foo
    FROM table2
) s
WHERE s.col2 > s.foo
不选择
foo
两次

我可以用Oracle SQL实现这一点吗?
它会比选择两次(或多次)更有效吗?

您可以这样写:

SELECT col1,col2-(SELECT foo FROM table1) 
FROM table2 
WHERE col2>(SELECT foo FROM table1)
SELECT
    s.col1, s.col2 - s.foo
FROM
(
    SELECT col1, col2, (SELECT foo FROM table1) as foo
    FROM table2
) s
WHERE s.col2 > s.foo

你可以这样写:

SELECT col1,col2-(SELECT foo FROM table1) 
FROM table2 
WHERE col2>(SELECT foo FROM table1)
SELECT
    s.col1, s.col2 - s.foo
FROM
(
    SELECT col1, col2, (SELECT foo FROM table1) as foo
    FROM table2
) s
WHERE s.col2 > s.foo

假设您的子查询返回一行(否则,两次使用子查询都会返回错误),只需执行笛卡尔连接即可

SELECT a.col1, a.col2 - b.foo
  FROM table2 a,
       (SELECT foo FROM table1) b
 WHERE a.col2 > b.foo

假设您的子查询返回一行(否则,两次使用子查询都会返回错误),只需执行笛卡尔连接即可

SELECT a.col1, a.col2 - b.foo
  FROM table2 a,
       (SELECT foo FROM table1) b
 WHERE a.col2 > b.foo
怎么样

WITH
  foo      AS  select foo from table1
SELECT
    col1, col2 - foo.foo
FROM
    table2, foo
WHERE
   col2 > foo.foo
怎么样

WITH
  foo      AS  select foo from table1
SELECT
    col1, col2 - foo.foo
FROM
    table2, foo
WHERE
   col2 > foo.foo
但前提是表1有一行


但前提是表1只有一行。

表1中真的只有一行吗?如果不是,这两个表之间的关系是什么?表1中真的只有一行吗?如果不是,两个表之间的关系是什么?+1 WITH子句是为了在多个位置重复使用子查询而明确提供的。请注意,在这种情况下,它实际上只在一个位置使用(在笛卡尔连接中)。但是,这可能是因为示例已经简化,而WITH是一件值得了解的事情。+1 WITH子句明确提供的目的是在多个位置重复使用子查询。请注意,在这种情况下,它实际上只在一个位置使用(在笛卡尔连接中)。然而,这可能是因为该示例已被简化,并且需要了解。