GVKun编程网logo

单个select语句中的多个cte,其中cte可以相互引用(一个select语句只能嵌套在一个select中对吗)

6

在本文中,我们将详细介绍单个select语句中的多个cte,其中cte可以相互引用的各个方面,并为您提供关于一个select语句只能嵌套在一个select中对吗的相关解答,同时,我们也将为您带来关于G

在本文中,我们将详细介绍单个select语句中的多个cte,其中cte可以相互引用的各个方面,并为您提供关于一个select语句只能嵌套在一个select中对吗的相关解答,同时,我们也将为您带来关于Go select语句中的优先权变通办法、LEFT JOIN与多个SELECT语句、MySQL SELECT语句中的存储过程变量、mysql: SELECT ... FOR UPDATE 对SELECT语句的阻塞实验的有用知识。

本文目录一览:

单个select语句中的多个cte,其中cte可以相互引用(一个select语句只能嵌套在一个select中对吗)

单个select语句中的多个cte,其中cte可以相互引用(一个select语句只能嵌套在一个select中对吗)

扩展以下问题(多重选择语句),我想知道是否可以执行以下操作:

WITH     cte1 as (      SELECT * from cdr.Location    ),    cte2 as (      SELECT * from cdr.Location        WHERE cdr.Location.someField = cte1.SomeField    )select * from cte1 union select * from cte2

所以这里的重点是以下几行:

 WHERE cdr.Location.someField = cte1.SomeField

我在cte2中的哪里引用cte1?

答案1

小编典典

是的,您可以在后续CTE中引用先前声明的CTE:

WITH cte1 as (  SELECT t.*     FROM cdr.Location t),     cte2 as (  SELECT t.*     FROM cdr.Location t    JOIN cte1 c1 ON c1.somefield = t.someField)SELECT *   FROM cte1 UNION SELECT *   FROM cte2

笔记

  1. 在cte1声明中加入cte2无效,因为该语句是自上而下执行的。
  2. 您可以根据需要使用JOINing来引用CTE,就像引用任何其他内联视图(它)或table / temp table / etc一样。

顺便说一句:尝试在将来树立更好的榜样-这对您和所有试图帮助您的SO社区其他成员都是有益的。

Go select语句中的优先权变通办法

Go select语句中的优先权变通办法

我希望在两个频道上进行go例程侦听,两个频道都排空时将其阻塞。但是,如果两个通道都包含数据,我希望先清空一个通道,再处理另一个通道。

在下面的工作示例中,我希望outexit处理所有内容之前先将其清空。我使用的select-statement没有任何优先顺序。我如何解决这个问题,使所有10个超值都在出口之前得到处理?

package mainimport "fmt"func sender(out chan int, exit chan bool){    for i := 1; i <= 10; i++ {        out <- i    }     exit <- true}func main(){    out := make(chan int, 10)    exit := make(chan bool)    go sender(out, exit)    L:    for {        select {            case i := <-out:                fmt.Printf("Value: %d\n", i)            case <-exit:                fmt.Println("Exiting")                break L        }    }    fmt.Println("Did we get all 10? Most likely not")}

答案1

小编典典
package mainimport "fmt"func sender(out chan int, exit chan bool) {    for i := 1; i <= 10; i++ {        out <- i    }    exit <- true}func main() {    out := make(chan int, 10)    exit := make(chan bool)    go sender(out, exit)    for {        select {        case i := <-out:            fmt.Printf("Value: %d\n", i)            continue        default:        }        select {        case i := <-out:            fmt.Printf("Value: %d\n", i)            continue        case <-exit:            fmt.Println("Exiting")        }        break    }    fmt.Println("Did we get all 10? I think so!")}

第一次选择的默认情况使其变为非阻塞。该选择将耗尽输出通道,而无需查看出口通道,否则将不等待。如果输出通道为空,则立即下降到第二选择。第二个选择是阻止。它将等待任一通道上的数据。如果有出口,它将对其进行处理并允许循环退出。如果有数据,它将返回循环的顶部并返回到耗尽模式。

LEFT JOIN与多个SELECT语句

LEFT JOIN与多个SELECT语句

我正在研究别人的PHP代码,并且一遍又一遍地看到这种模式:

(伪代码)

result = SELECT blah1,blah2,foreign_key FROM foo WHERE key=bar

if foreign_key > 0  
  other_result = SELECT something FROM foo2 WHERE key=foreign_key  
end

如果其他表中没有相关行,则代码需要分支,但是通过在单个SELECT语句中执行LEFT
JOIN不能做到更好吗?我是否缺少一些性能优势?可移植性问题?还是我只是在挑剔?

MySQL SELECT语句中的存储过程变量

MySQL SELECT语句中的存储过程变量

如何解决MySQL SELECT语句中的存储过程变量?

更正了一些问题,并添加了一个替代选择-适当删除。

DELIMITER |

CREATE PROCEDURE getNearestCities
(
IN p_cityID INT -- should this be int unsigned ?
)
BEGIN

DECLARE cityLat FLOAT; -- should these be decimals ?
DECLARE cityLng FLOAT;

    -- method 1
    SELECT lat,lng into cityLat, cityLng FROM cities WHERE cities.cityID = p_cityID;

    SELECT 
     b.*, 
     haversine(cityLat,cityLng, b.lat, b.lng) AS dist 
    FROM 
     cities b 
    ORDER BY 
     dist 
    LIMIT 10;

    -- method 2
    SELECT   
      b.*, 
      haversine(a.lat, a.lng, b.lat, b.lng) AS dist
    FROM     
      cities AS a
    JOIN cities AS b on a.cityID = p_cityID
    ORDER BY 
      dist
    LIMIT 10;

END |

delimiter ;

解决方法

我正在尝试创建一个存储过程。这是我到目前为止(不起作用)的内容:

DELIMITER |
CREATE PROCEDURE getNearestCities(IN cityID INT)
    BEGIN
        DECLARE cityLat FLOAT;
        DECLARE cityLng FLOAT;
        SET cityLat = SELECT cities.lat FROM cities WHERE cities.id = cityID;
        SET cityLng = SELECT cities.lng FROM cities WHERE cities.id = cityID;
        SELECT *,HAVERSINE(cityLat,cityLng,cities.lat,cities.lng) AS dist FROM cities ORDER BY dist LIMIT 10;
    END |

HAVERSINE是我创建的可以正常工作的函数。如您所见,我正在尝试从“城市”表中获取城市的ID,然后将cityLat和cityLng设置为该记录的其他值。我显然在这里通过使用SELECTs做错了。

这有可能吗?看来应该如此。任何帮助将不胜感激。

mysql: SELECT ... FOR UPDATE 对SELECT语句的阻塞实验

mysql: SELECT ... FOR UPDATE 对SELECT语句的阻塞实验

开两个连接A, B, 分别执行以下三个sql

start transaction; -- 1
SELECT * FROM phpbb3.phpbb_ranks where rank_id=1 for update; -- 2
commit; -- 3

start transaction; -- 1
SELECT * FROM phpbb3.phpbb_ranks where rank_id=1; -- 2
SELECT * FROM phpbb3.phpbb_ranks where rank_id=1 for update; -- 3
commit; -- 4

在A执行完1和2后,

B执行1, 正常
B执行2, 立即返回
B执行3, 这时候被阻塞了

A执行3后, B的3立即返回

可以得到的结论: 如果使用了SELECT ... FOR UPDATE, 对其他事务中的SELECT无影响, 但是会阻塞其他事务中的SELECT ... FOR UPDATE

 

关于单个select语句中的多个cte,其中cte可以相互引用一个select语句只能嵌套在一个select中对吗的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于Go select语句中的优先权变通办法、LEFT JOIN与多个SELECT语句、MySQL SELECT语句中的存储过程变量、mysql: SELECT ... FOR UPDATE 对SELECT语句的阻塞实验等相关内容,可以在本站寻找。

本文标签: