Возможно ли это в SQL? - PullRequest
       16

Возможно ли это в SQL?

1 голос
/ 18 августа 2010

Допустим, у меня есть таблица с именем «разновидности» с 3 столбцами: «Id», «ancestorId» и «name». «AncestorId» - это «Id» вида предка, например, если предком человека разумного является «авралопитек», а «идентификатором» австралопитека является 5, то «предком» человека гомосапиена будет 5. Допустим, также, что существует вид под названием «Первый вид», чей «Id» равен 0 или нулю. Поэтому я хочу выбрать список предков от определенного вида, скажем, homo sapiens, до «Первого вида», независимо от того, сколько узлов находится в пути. Возможно ли это с SQL?

Ответы [ 5 ]

3 голосов
/ 18 августа 2010

ANSI может использовать рекурсивное предложение WITH:

WITH hierarchy AS (
  SELECT t.id, 
         t.name,
         t.ancestor
    FROM TABLE t
   WHERE t.ancestor IS NULL
  UNION
  SELECT t.id, 
         t.name,
         t.ancestor
    FROM TABLE t
    JOIN hierarchy h ON h.ancestorid = t.id)
SELECT *
  FROM hierarchy

Поддерживается:

  • SQL Server 2005 +
  • Oracle 11gR2
  • PostgreSQL 8.4 +

В Oracle была поддержка иерархических запросов начиная с v2 с использованием синтаксиса CONNECT BY.

3 голосов
/ 18 августа 2010

Управление иерархическими данными в MySQL - хороший ресурс для того, о чем вы говорите, особенно если вы работаете с системой баз данных, которая не поддерживает рекурсивные запросы. В нем обсуждается, как вам нужно структурировать ваши данные, чтобы делать то, что вы хотите, проще.

0 голосов
/ 18 августа 2010

Скорее всего, вы не хотите, чтобы ваш первый вид имел нулевой идентификатор.null очень отличается от 0. null означает, что вы не знаете, каково значение.0 означает, что значение равно 0. Обратите внимание, что null <> null, а 0 = 0. Это может повлиять на то, как вы ищете для распознавания первого вида.

0 голосов
/ 18 августа 2010
WITH hierarchy AS ( 
  SELECT t.id,  
         t.name, 
         t.ancestor 
    FROM TABLE t 
   WHERE t.ancestor IS NULL 
  UNION 
  SELECT t.id,  
         t.name, 
         t.ancestor 
    FROM TABLE t 
    JOIN hierarchy h ON h.ancestorid = t.id) 
SELECT * 
  FROM hierarchy 
0 голосов
/ 18 августа 2010

Да, это возможно в SQL. Вы можете использовать рекурсивные запросы для этой цели. Взгляните на здесь . Читайте полную страницу.

WITH req_query AS 
(
  SELECT  id, 
          name,
          ancestorid
  FROM    your_table
  WHERE   name='homo sapiens'    //If you want to search by id, then change this line

  UNION

  SELECT  yt.id, 
          yt.name,
          yt.ancestorid
  FROM    your_table yt,
          req_query rq
  WHERE   yt.id = rq.ancestorid
          AND rq.id != 0
          AND rq.id is not null
)

SELECT  * 
FROM    req_query
;

Редактировать Это будет работать с ORACLE, SQL Server, PostgreSQL и с любой другой базой данных, которая поддерживает рекурсивные запросы. Для работы с базами данных, которые не поддерживают рекурсивные запросы, вам придется использовать модель вложенного набора.

...