2008-11-17 16 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中的記錄的表也不會有匹配的記錄。

因此,所有空值的第一列將是一開始。

相關問題