Ferramenta para descobrir por que um SQL SELECT não devolve quaisquer dados

votos
2

Existe uma ferramenta que lhe diz (ou lhe dá uma dica) por uma instrução select em particular dose não devolver quaisquer linhas dadas os dados atuais em seu banco de dados.

por exemplo, se você tivesse a 4 tabela a seguir junte

select * 
from a, b, c, d
where a.b_id = b.id
and b.c_id = c.id
and c.d_id = d.id

Se houvesse linhas que satisfizeram as condições a.b_id = b.id também linhas que satisfizeram b.c_id = c.id mas há linhas que preenchessem o requisito c.d_id = d.id seria destacar c.d_id = d.id como o problema.

Ou seja, seria brake-se a cláusula where e descobrir qual das condições sub retornou verdadeiro e destacar aqueles que não retornam verdadeiro.

Não funcionaria bem para querys complexos, mas muitas instruções select são simples junta-se ao longo muitas mesas.

Isso seria útil ao criar dados de teste para exercer uma paz de código do aplicativo ou depurar um problema com um sistema vivo.

Gráfica explicar ferramentas (que mostram o plano do caminho exiection real) se aproximam, mas eles mostram muita informação e não destacar o elo perdido no seleto stament.

Eu estou usando postgres, sqllight e mysql, mas estaria interessado em como ferramentas para outros bancos de dados / plataformas de trabalho.

Im também interessado em quaisquer técnicas manula.

Alguém mais tem esse problema?

Será que alguém estar interessado se eu escrevi essa ferramenta?

Publicado 17/11/2008 em 23:55
fonte usuário
Em outras línguas...                            


5 respostas

votos
12

Eu nunca tem esse problema, mas eu também usar explícita junta-se assim que é geralmente tão simples como executar partes da consulta até que eu descobrir qual deles está restringindo meus resultados incorretamente.

No seu caso

SELECT *
FROM a -- First run just to here, are there records?
INNER JOIN b
    ON a.b_id = b.id -- Then run just to here, is it OK?
INNER JOIN c
    ON b.c_id = c.id -- Then run just to here, is it OK?
INNER JOIN d
    ON c.d_id = d.id -- Then run just to here, is it OK?
Respondeu 18/11/2008 em 00:03
fonte usuário

votos
1

Isto irá ajudar a começar ...

seleccione contagem de (1) a partir de a, b, onde a.b_id = b.id

seleccione contagem de (1) a partir de b, c onde b.c_id = c.id

seleccione contagem de (1) a partir de c, d em que c.d_id = d.id

Note-se que você está usando e assim a sobreposição das consultas acima pode não ser o que você espera.

OU

Usando o MS-SQL Server Management Studio ... Mostrar a "plano de execução" e mouse sobre os nós para "número real de linhas".

Respondeu 18/11/2008 em 00:09
fonte usuário

votos
2

Não há uma ferramenta para fazer isso por si mesmo, porque, como outros cartazes têm apontado, é simples o suficiente para apenas destacar porções sucessivamente maiores da consulta (se tiver formatado bem, com uma cláusula de ANDed por linha) e ver como muitos registros são retornados. Fazendo a junta explícita é essencial aqui, porque o mais provável, é aí que você está perdendo linhas, não com suas cláusulas WHERE.

Eu posso ver isso sendo um mini-ferramenta interessante, no entanto, a tomar uma consulta SQL com n predicados como entrada e retornar um gráfico do resultado da contagem depois de acrescentar cada separada e cláusula para o tronco da declaração ... algo como:

part           count
-------------- -------------
TRUNK          100
AND clause 1   90
AND clause 2   85
...            ...
AND clause n   20

SQL Management Studio pode oferecer meios para ligar uma pequena ferramenta como este como um macro, pode valer a pena explorar. Postá-lo aqui, se você faz! :)

Respondeu 18/11/2008 em 03:03
fonte usuário

votos
1

Você deve ser capaz de estudar o plano de execução (se você estiver usando SQL Server, caso contrário, um recurso semelhante em seu banco de dados) para ver onde a junta produzir um conjunto vazio.

Respondeu 18/11/2008 em 08:50
fonte usuário

votos
1

Eu normalmente usar a abordagem descrita por Cade Roux

Mas, teoricamente, você poderia usar a seguinte consulta:

SELECT a.id, b.id, c.id, d.id
FROM a 
LEFT JOIN b
    ON a.b_id = b.id
LEFT JOIN c
    ON b.c_id = c.id
LEFT JOIN d
    ON c.d_id = d.id

As linhas que retornam todos os valores NULL iria apontá-lo para a mesa sem dados correspondentes. Por exemplo, se todos os c.id foram nulos isso significaria que não houve registros correspondentes na tabela c.

Claro que todas as outras mesas que dependem dos registros na tabela c teria nenhum registro correspondente também.

Assim, a primeira coluna com todos os valores nulos será o único a começar.

Respondeu 18/11/2008 em 12:00
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more