2013-11-26 86 views
0

我有下面的代碼,它不應該返回任何值。有沒有人可以找到有問題的東西?當我運行腳本時,我得到了0個值(0行受到影響),儘管我知道應該選擇一些行。基於內部連接的select查詢不起作用,不返回任何內容

這只是整個腳本的一部分,當我運行所有內容時,我會收到錯誤消息「警告:空值由集合或其他SET操作消除」。但我不知道這對我的劇本意味着什麼。我在腳本中只有1個「group by」(我不在這裏發佈,因爲這個編碼工作)。有人知道嗎?

的代碼,下面,應該創建臨時表,並從表中「StatusHistorik」臨時表插入行,其中滿足以下條件:

1)[NyStatus] = 4(NyStatus是來自「StatusHistorik」表的列,

2)變量「EnhetsId」不應該存在於表「SKL_AdminKontroll_SkaÅtgärdas」(F)中。代碼:「F.EnhetsId爲null」。

我在這兩種情況下都使用了內連接。這應該會導致temp-table中的一些觀察/行,但不會返回任何結果。有沒有人發現任何編碼錯誤,可以解釋缺乏結果?

我應該提到,當我「註釋掉」最後一個內部連接和where語句的最後部分時,腳本按照它應該的那樣工作。所以我懷疑這是最後一個內部聯接聲明,它在某種程度上是錯誤的。

declare @temp2 table (
    EnhetsId varchar(50), 
    TjanstId Int, 
    Tabell varchar(50), 
    Kommentar ntext, 
    Uppdaterad datetime 
); 
WITH ENHET_AVSLUT AS 
(
     SELECT DISTINCT A.[EnhetsId] 
     FROM [StatistikinlamningDataSKL].[dbo].[StatusHistorik] A 
     inner join (
       select [EnhetsId], max(SenastUppdaterad) as SenastDatum 
       from [StatistikinlamningDataSKL].[dbo].[StatusHistorik] 
       group by [EnhetsId] 
       ) B 
     on A.[EnhetsId] = B.[EnhetsId] and A.[SenastUppdaterad] = B.SenastDatum 
     INNER JOIN 
       StatistikinlamningDataSKL.dbo.SKL_AdminKontroll_SkaÅtgärdas F ON A.EnhetsId = F.EnhetsId 
     WHERE [NyStatus] = 4 AND F.EnhetsId is null 
) 
insert into @temp2 
    (EnhetsId, TjanstId, Tabell, Kommentar, Uppdaterad) 
SELECT 
    EnhetsId, 1, ''GR_PS09_1'', ''OK'', getdate() 
from ENHET_AVSLUT 

select * from @temp2 

最好的問候, 漢納斯

+0

使用LEFT OUTER JOIN爲表SKL_AdminKontroll_SkaÅtgärdas。 – user2989408

+0

謝謝!它解決了這個問題。雖然,我注意到完整的腳本仍然無法工作,我想,由於錯誤消息:警告:Null值被聚合或其他SET操作消除。 你對這個問題有什麼想法嗎? – user2995808

回答

0

因爲你說的

The variable "EnhetsId" should not exist in the table "SKL_AdminKontroll_SkaÅtgärdas" (F). Code: "F.EnhetsId is null". 

的INNER JOIN會嘗試加入的表,將無法執行JOIN上NULL值,因此結果將是零行。

因此,您必須嘗試使用​​LEFT JOIN,其中無論JOIN條件是否滿足,都將拉動左上表。

但我必須警告你,如果表很大,它可能會有性能問題。

你內心的SQL必須像

SELECT DISTINCT A.[EnhetsId] 
    FROM [StatistikinlamningDataSKL].[dbo].[StatusHistorik] A 
    inner join (
      select [EnhetsId], max(SenastUppdaterad) as SenastDatum 
      from [StatistikinlamningDataSKL].[dbo].[StatusHistorik] 
      group by [EnhetsId] 
      ) B 
    on A.[EnhetsId] = B.[EnhetsId] and A.[SenastUppdaterad] = B.SenastDatum 
    LEFT JOIN 
      StatistikinlamningDataSKL.dbo.SKL_AdminKontroll_SkaÅtgärdas F ON A.EnhetsId = F.EnhetsId 
    WHERE [NyStatus] = 4 
+0

你是對的,左連接是正確的方法。但我仍然需要「AND F.EnhetsId爲空」來避免那些不在表中「SKL_AdminKontroll_SkaÅtgärdas」 – user2995808

+0

@ user2995808正確的,添加F.EnhetsID IS NULL將排除表F中的那些,它相當於WHERE NOT EXISTS(.. 。在F中選擇你的連接謂詞..)參見http://archive.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=QueryBasedUponAbsenceOfData – ARA

相關問題