Pergunta

Vamos dizer que eu tenho a seguinte tabela:

ID | parentID | MoreStuff
1  | -1       |  ...
2  |  1       |  ...
3  |  1       |  ...
4  |  2       |  ...
5  |  1       |  ...

Como posso gerar uma instrução SQL SELECT para descobrir se uma linha específica tem filhos? Em outras palavras, eu quero saber se ID 1 tem filhos, o que, neste caso, tem 3.

Eu não tenho certeza de como criar a instrução SQL:

SELECT ID, hasChildren FROM myTable;

O que seria substituído por hasChildren no exemplo acima instrução SQL SELECT?

Foi útil?

Solução

Nenhuma versão do grupo:

SELECT MyTable.Id, CASE WHEN EXISTS 
    (SELECT TOP 1 1  --you can actually select anything you want here
     FROM MyTable MyTableCheck 
     WHERE MyTableCheck.ParentId = MyTable.Id
    ) THEN 1 ELSE 0 END AS HasRows
FROM MyTable

Outras dicas

Junte-se à mesa sobre si mesmo para descobrir se ele tem filhos:

SELECT 
    parent.id as ID
,   case when count(child.id) > 0 then 1 else 0 end as hasChildren 
FROM       myTable parent
LEFT JOIN  myTable child
ON         child.parentID = parent.ID
GROUP BY   parent.id

Se você já sabe sabe o ID pai, em seguida, a consulta é simples -. Basta selecionar o número de linhas com que ID pai

SELECT count(*) FROM myTable where parentID = 1;

Existem respostas muito válidas para a sua pergunta, que irão trabalhar. No entanto, gostaria de considerar o desempenho de tal uma consulta se o seu conjunto de dados é muito grande.

Se você vai usar um grupo, ou Sub consulta para obter os dados, em seguida, certifique-se ambas as colunas ID e os pais têm índices separados.

Para obter um desempenho ainda melhor, você deve adicionar uma coluna chamada "HasChildren", que poderia ser um tipo de dados "bit". Esta coluna deve ser atualizado a partir de seu código de aplicação quando os itens são inseridas ou excluídas. Isso permitirá que você para executar a consulta muito mais rápido:

SELECT * FROM table WHERE haschildren IS NOT NULL

As soluções acima são bons, mas você não deve adicionar coluna como 'HasChildren' a menos que você realmente tem um problema de desempenho (ver o post por GateKiller). coluna tal desnormaliza o banco de dados, ou seja, o mesmo pedaço de informação será armazenada em 2 lugares, o que torna mais provável para os seus dados para se tornar inconsistente. Você terá que manter esta coluna sempre que você inserir um novo filho, apagar um já existente ou atualizar o pai de uma criança.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top