2008-11-17 20 views
2

是否有一个工具告诉你(或给你一个提示)为什么一个特定的select语句不会返回给定数据库中当前数据的任何行。找出为什么SQL select没有返回任何数据的工具

例如,如果你有以下4个表连接

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

如果有哪个满足的条件a.b_id =也b.id其满足b.c_id = c.id但没有排又一排排它满足条件c.d_id = d.id它会突出显示c.d_id = d.id作为问题。

也就是说,它会制止where子句,并找出哪些子条件返回true,并突出显示那些不返回true的子条件。

对于复杂的查询来说,它不能很好地工作,但许多select语句都是简单地连接到大量表上。

当创建测试数据以执行应用程序代码的和平或调试实时系统的问题时,这将非常有用。

图形说明工具(显示实际展示路径的计划)接近,但它们显示的信息太多,并且不突出显示选择标准中缺失的链接。

我使用postgres,sqllight和mysql,但会对其他数据库/平台的工具如何工作感兴趣。

我也对任何manula技术感兴趣。

其他人有这个问题吗?

如果我写了这样的工具,有人会感兴趣吗?

回答

1

这将让你开始...

SELECT COUNT(1)从A,B,其中a.b_id = b.id

SELECT COUNT( 1)从b,C,其中b.c_id = c.id

SELECT COUNT(1)从C,d其中c.d_id = d.id

请注意,您正在使用AND,因此上述查询的重叠可能不是您所期望的。

OR

使用MS-SQL Server Management Studio中...... 显示 “执行计划” 和鼠标的 “实际行数” 的节点。

12

我从来没有这个问题,但我也使用显式连接,所以它通常像运行查询的部分一样简单,直到我找出哪个是不正确地限制我的结果。

在你的情况

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? 
+0

+1。 10分钟前我做了同样的事情! – 2008-11-17 23:11:11

+0

我使用完全相同的策略!所以我不会是一个为我做的工具。即从where子句的顶部开始,直到查询“刹车”。 – Mark 2008-11-17 23:16:59

+0

所有它可以节省我的是高亮显示,F5,高亮显示,F5 - 它不会经常发生,因为它很容易自动调整,因为从SP或视图提取代码并添加适当的线束通常需要更长的时间。 – 2008-11-17 23:24:49

2

本身没有一种工具可以做到这一点,因为正如其他海报所指出的,只需突出显示连续较大部分的查询(如果格式良好,每行一个ANDed子句就足够简单)并查看返回了多少条记录。在这里明确连接是很关键的,因为很可能,这是你丢失行的地方,而不是你的WHERE子句。

虽然我可以看到它是一个有趣的迷你工具,但它将n个谓词作为输入,并在将每个单独的AND子句附加到语句的树干后返回计数结果的图形。如:

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

SQL管理工作室可能提供了一种方法来像这样插入一个像宏一样的小工具,这可能是值得探讨的。如果你这样做,请在这里发布! :)

1

您应该能够研究执行计划(如果您正在使用SQL Server,否则数据库中具有类似功能)以查看连接产生空集的位置。

1

我通常使用的方法described by Cade Roux

但理论上你可以使用下面的查询:

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 

返回所有NULL值将指向你的表中没有匹配数据的行。 例如如果所有c.id均为null,则表示c表中没有匹配的记录。

当然,所有其他依赖表c中的记录的表也不会有匹配的记录。

因此,所有空值的第一列将是一开始。

相关问题