在本文中,我们将详细介绍单个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中对吗)
- Go select语句中的优先权变通办法
- LEFT JOIN与多个SELECT语句
- MySQL SELECT语句中的存储过程变量
- mysql: SELECT ... FOR UPDATE 对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
笔记
- 在cte1声明中加入cte2无效,因为该语句是自上而下执行的。
- 您可以根据需要使用JOINing来引用CTE,就像引用任何其他内联视图(它)或table / temp table / etc一样。
顺便说一句:尝试在将来树立更好的榜样-这对您和所有试图帮助您的SO社区其他成员都是有益的。
Go select语句中的优先权变通办法
我希望在两个频道上进行go例程侦听,两个频道都排空时将其阻塞。但是,如果两个通道都包含数据,我希望先清空一个通道,再处理另一个通道。
在下面的工作示例中,我希望out
在exit
处理所有内容之前先将其清空。我使用的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语句
我正在研究别人的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语句中的存储过程变量?
更正了一些问题,并添加了一个替代选择-适当删除。
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语句的阻塞实验
开两个连接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语句的阻塞实验等相关内容,可以在本站寻找。
本文标签: