我在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服务器之间的差异,但找不到任何基本的东西。
答案 0 :(得分:1)
无论Sql Server的版本和版本如何,我相信原始查询中存在潜在的错误。看来,您的要求是显示用户已回答的问题:
userantwoord
我不相信您应该通过任何类型的加入加入userantwoord
表,相反,您可以使用CROSS JOIN
获取给定用户或用户的所有问题的笛卡尔积,然后只有LEFT JOIN
到userantwoord
,这将为不匹配的用户返回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
谓词。