2010-07-07 82 views
0

當我沒有找到基於我的查詢的記錄但沒有找到正確的記錄時,我正在尋找顯示'O'或'沒有找到結果'。我認爲問題來自於我試圖顯示有關我正在統計的記錄的信息以及有多少符合條件的信息。也許它不是我需要用ISNULL進行更改的計數,但是如果沒有行輸出,可以修改結果。SQL - 顯示零結果

感謝您提前提供任何幫助。

select t3.countyname, t2.titleunitname, t1.transdesc, count (isnull(t3.orderkey,0)) as c1 
     from tblorder as t3 
     left join qryOrderRecord1 as t1 on t3.OrderKey = t1.OrderKey 
     left join qrytitleunits as t2 on t3.titleunitnum = t2.titleunitnum 
     WHERE t1.transdesc = 'LETTERS' 
     AND (t3.OrderDateTime between '7/7/2010' AND '7/7/2010') 
     AND t3.countyname = 'Frankfurt' 
     AND t2.titleunitname = 'Maxwell' 
     group by t3.countyname,t1.transdesc, t2.titleunitname 

回答

2

我認爲你需要算t1.orderkey T3是上外的左側加入所以它是t1.orderkey值,這將是NULL

而且我感動的T1和T2的過濾器進入JOIN條件不是WHERE條款

如果不這樣做的伎倆提供您的問題將幫助一些樣本數據。

SELECT t3.countyname, 
    t2.titleunitname, 
    t1.transdesc , 
    COUNT(t1.orderkey) AS c1 /*As dotjoe's answer suggests*/ 
FROM tblorder      AS t3 
    LEFT JOIN qryOrderRecord1  AS t1 
    ON t3.OrderKey = t1.OrderKey 
    AND t1.transdesc = 'LETTERS' 
    LEFT JOIN qrytitleunits AS t2 
    ON t3.titleunitnum = t2.titleunitnum 
    AND t2.titleunitname = 'Maxwell' 
WHERE t3.OrderDateTime BETWEEN '7/7/2010' AND '7/7/2010' /*Seems odd! Should these be 
                  different dates?*/ 
AND t3.countyname = 'Frankfurt' 
GROUP BY t3.countyname, 
    t1.transdesc  , 
    t2.titleunitname 
+0

+1是OP通過在where子句中放置限制,有效地將這些外部聯接轉換爲內部聯接。好點子。 – dotjoe 2010-07-07 23:45:19

+0

哎呀我想我的意思是把這個答案放在我的評論不是另一個。仍然在這裏張貼的掛處顯然> _ < – bnw 2010-07-08 14:23:39

+0

http://stackoverflow.com/questions/1250819/show-message-when-no-rows-selected-mysql-php 這就是我想要做的,但與sql和php。看起來我需要在PHP端做到這一點。無論如何,感謝您的幫助。 – bnw 2010-07-08 14:27:12

2

count(isnull(column, 0))相同count(1)count(*)。請參閱爲什麼...

Count(*) vs Count(1)

也許你想count(t1.orderkey)這個問題?這不會計算任何空t1.orderkey。

+0

+1斑點。 – 2010-07-08 00:00:30

+0

感謝您在清理sql的幫助。我意識到我想要的是簡單得多,然後我的問題/代碼暗示。 使用的AdventureWorks SELECT AddressID
FROM Person.Address 其中POSTALCODE = '63108' 是否有顯示類似 「搜索沒有結果」 的消息的方式,如果沒有結果/行被發現的? – bnw 2010-07-08 14:15:53

+0

是的,通常這將由查詢的消費者處理。我想你可以檢查'if @@ rowcount = 0開始選擇'沒有結果';結束「後選擇。但是,那會給你2個結果集......第一個沒有行。或者選擇一個表變量,檢查行並確定返回哪個結果集。讓調用查詢的代碼處理這個問題簡單得多。 – dotjoe 2010-07-08 19:00:23

0

給這個鏡頭。

select t3.countyname, t2.titleunitname, t1.transdesc, count (isnull(t3.orderkey,0)) as c1 
into #Tmp 
from tblorder as t3 
    left join qryOrderRecord1 as t1 on t3.OrderKey = t1.OrderKey 
    left join qrytitleunits as t2 on t3.titleunitnum = t2.titleunitnum 
where t1.transdesc = 'LETTERS' 
    AND (t3.OrderDateTime between '7/7/2010' AND '7/7/2010') 
    AND t3.countyname = 'Frankfurt' 
    AND t2.titleunitname = 'Maxwell' 
group by t3.countyname,t1.transdesc, t2.titleunitname 

if @@ROWCOUNT > 0 
    select * 
    from #Tmp 
else 
    select 'No Results Found.'