簡體   English   中英

有什么方法可以在JOIN部分的SELECT FROM(查詢)語法中重新使用子查詢?

[英]Are there any ways to re-use subquery in SELECT FROM (query) syntax in JOIN part?

我有簡單的test

CREATE TABLE test (
  id INT NOT NULL PRIMARY KEY
);
INSERT INTO test (id) VALUES (1), (2), (3), (6), (8), (9), (12);

而且我正在嘗試使用subselect為每行添加行號(由於mysql版本的原因,不能使用ROW_NUMBER()或其他技巧)。

SELECT 
  tlist.id as `from`,
  tlist1.id as `to`
FROM 
  (
    SELECT 
      t1.id as id, @row_num := IFNULL(@row_num+1, 1) as num 
    FROM test as t1
  ) as tlist
INNER JOIN
  (
    SELECT 
      test.id as id, @row_num1 := IFNULL(@row_num1+1, 1) as num 
    FROM test
  ) as tlist1 ON tlist.num + 1 = tlist1.num
WHERE tlist.id + 1 < tlist1.id

問題是我不得不為INNER JOIN查詢中的每一行創建新的subselect,因為我不能INNER JOIN tlist as tlist1因為tlist不是真正的數據庫表。 有什么方法可以重用tslit子查詢?

有沒有什么方法可以重用tslit子查詢 -不,這是一種在mysql中模擬row_number功能的方法,盡管ifnull位通常這樣表示為交叉聯接-

SELECT 
  tlist.id as `from`,
  tlist1.id as `to`
FROM 
  (
    SELECT 
      t.id as id, @row_num := @row_num+1 as num 
    FROM t  cross join (select @row_num:=0) r
  ) as tlist
INNER JOIN
  (
    SELECT 
      t.id as id, @row_num1 := @row_num1+1 as num 
    FROM t cross join(select @row_num1:=0) r1
  ) as tlist1 ON tlist.num + 1 = tlist1.num
WHERE tlist.id + 1 < tlist1.id;

但是在這種情況下

SELECT T1.ID T1ID ,(SELECT MIN(T2.ID) FROM T T2 WHERE T2.ID > T1.ID) T2ID
FROM T T1
HAVING  T1.ID + 1 < T2ID;

可能就足夠了。 但是我想您真正要確定的是id是否存在任何間隔(假設id遞增1)?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM