Azure SQL和SQL Server Standard之间的不同结果

时间:2015-11-14 12:23:28

标签: sql-server azure-sql-database

我在SQL Server Standard和Azure SQL中有相同的查询(见下文)。但遗憾的是,即使数据库中的数据相同,它们也没有相同的结果。 Vraag(即问题)有12行。回答了一个问题(userantwoord)。在SQL Server上,它显示了12个问题,其中一个有id_antwoord。其他人都是空的。在Azure中,它只显示已回答的问题并将其余部分排除在外。当我只选择带有类别的问题时,它会显示12个问题。

SELECT vraag.i_d__categorie, vraag.i_d, vraag.niveau, vraag.omschrijving, 
       vraag.volgorde, vraag.code, vraag.gewicht, vraag.tekst, vraag.thema1, 
       vraag.thema2, vraag.thema3, vraag.thema4, vraag.thema5, vraag.thema6, 
       userantwoord.id_antwoord
FROM   categorie 
       LEFT OUTER JOIN vraag 
         LEFT OUTER JOIN Users 
           INNER JOIN userantwoord 
           ON Users.UserId = userantwoord.Id_user 
         ON vraag.i_d = userantwoord.id_vraag 
       ON categorie.i_d = vraag.i_d__categorie

WHERE categorie.link = @Onderwerp AND vraag.niveau = @Niveau 
      AND ([Users].UserId = @UserID OR [Users].UserId is null)
ORDER BY vraag.volgorde

Userantwoord的定义如下:

CREATE TABLE [dbo].[userantwoord](
[id] [uniqueidentifier] NOT NULL,
[id_antwoord] [uniqueidentifier] NULL,
[id_vraag] [uniqueidentifier] NULL,
[Id_user] [uniqueidentifier] NULL,
CONSTRAINT [PK_userantwoord] PRIMARY KEY CLUSTERED

在所有正确的地方都有外键。 有什么我忘了看的东西?我在互联网上搜索了Azure en SQL服务器之间的差异,但找不到任何基本的东西。

1 个答案:

答案 0 :(得分:1)

无论Sql Server的版本和版本如何,我相信原始查询中存在潜在的错误。看来,您的要求是显示用户已回答的问题:

  • 针对特定类别和级别的所有问题
  • 对于特定用户或所有用户(取决于是否提供空过滤器)
  • 如果用户未回答某个特定问题,则userantwoord
  • 中将没有相应的行

我不相信您应该通过任何类型的加入加入userantwoord表,相反,您可以使用CROSS JOIN获取给定用户或用户的所有问题的笛卡尔积,然后只有LEFT JOINuserantwoord,这将为不匹配的用户返回NULL。

所以这是另一种选择:

SELECT vraag.id_categorie, vraag.id, vraag.niveau, vraag.omschrijving, 
       vraag.volgorde, vraag.code, users.Name, userantwoord.id_antwoord
FROM   dbo.categorie 
       INNER JOIN dbo.vraag 
         ON categorie.id = vraag.id_categorie
        CROSS JOIN dbo.Users 
        LEFT OUTER JOIN dbo.userantwoord 
        ON Users.UserId = userantwoord.Id_user AND vraag.id = userantwoord.id_vraag
WHERE categorie.link = @Onderwerp AND vraag.niveau = @Niveau 
      AND ([Users].UserId = @UserID OR @UserID is null) -- **
ORDER BY Users.Name, vraag.volgorde;

如果您只对单个用户使用查询,则不需要@UserID is null谓词。

SqlFiddle example here