Есть ли способы повторно использовать подзапрос в синтаксисе SELECT FROM (запрос) в части JOIN?

0

У меня есть простой test стол

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

И я пытаюсь использовать subselect для добавления номеров строк для каждой строки (не может использовать ROW_NUMBER() или другие хаки из-за версии mysql).

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 потому что я не могу делать INNER JOIN tlist as tlist1 поскольку tlist не является реальной таблицей базы данных. Существуют ли способы повторного использования подзапроса tslit?

  • 1
    в MySQL 8.0 есть способ повторно использовать (под) запросы, которые называются CTS (Common Table Expression) (но MySQL 8.0 не готов к работе). в более низких версиях MySQL нет никакого способа повторно использовать (под) запросы
  • 0
    Спасибо, CTE интересный синтаксис, будет ждать 8.0, но в настоящее время пытается найти решение в MySQL 5.6
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Существуют ли способы повторного использования подзапроса tslit - Нет, это способ имитации функциональности row_number в mysql, хотя бит 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)?

  • 0
    Да, вы правы, я пытаюсь найти пропуски в последовательности идентификаторов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню