基于内部联接的选择查询不起作用,不返回任何内容

时间:2013-11-26 18:07:25

标签: sql sql-server select inner-join where

我有下面的代码,它不应该返回任何值。有没有人能找到任何有问题的东西?当我运行脚本时,我得到0值(0行受影响),即使我知道应该选择行。

这只是整个脚本的一部分,当我运行所有内容时,我收到错误消息“警告:聚合或其他SET操作消除了空值”。但我不知道这对我的剧本意味着什么。我在脚本中只有1个“分组依据”(由于编码工作原因,我不在此处发布)。有谁知道吗?

下面的代码应该创建一个临时表,并从表“StatusHistorik”中插入临时表插入行,满足以下条件:

1)[NyStatus] = 4(NyStatus是表“StatusHistorik”中的一列),

2)表“SKL_AdminKontroll_SkaÅtgärdas”(F)中不应存在变量“EnhetsId”。代码:“F.EnhetsId为null”。

我在两种情况下都使用了内连接。这应该导致临时表中的许多观察/行,但不返回任何内容。有没有人发现任何可以解释缺少结果的编码错误?

我应该提一下,当我“注释掉”最后一个内连接和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

祝你好运, 汉纳斯

1 个答案:

答案 0 :(得分:0)

因为你在说

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

INNER JOIN将尝试连接表,并且无法对NULL值执行JOIN,因此结果将为零行。

因此,您必须尝试使用​​LEFT JOIN,无论满足JOIN条件,都将拉出LE LEFT表。

我必须警告你,如果表格很大,可能会出现性能问题。

您的内部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