SELECT行WHERE NOT EXISTS来自2个表的条件

时间:2016-06-21 06:49:15

标签: c# sql asp.net razor

我有2 tables,分别名为SectionAccessAdminConsole。 SectionAccess包含字段

 - User Access
 - User ID
 - Link.

1用户ID可以有几个链接。 AdminConsole包含字段

 - Link
 - Project ID (PPMID)
 - Application ID (EPRID)
 - Project Name.

每个链接都有一个独特的项目。

我使用webpage创建Razor,用户可以在其中输入用户ID,并且网页会在表格中显示当前位于该用户ID下的项目。我为此做的SQL查询是:

SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess 
INNER JOIN AdminConsole ON SectionAccess.Link=AdminConsole.Link 
WHERE SectionAccess.UserID like ('%" + Request["UserID"] + "%');

这很有效。现在我在这个表下面添加另一个表,它将显示与该用户ID无关的项目。我这样做了,但它没有返回任何东西。

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole
WHERE NOT EXISTS 
(SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess 
INNER JOIN AdminConsole ON SectionAccess.Link=AdminConsole.Link 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "');

这里的问题是什么?

3 个答案:

答案 0 :(得分:0)

尝试省略子查询中的连接:

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole
WHERE Link NOT IN 
(SELECT SectionAccess.Link FROM SectionAccess 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "');

答案 1 :(得分:0)

存在无法返回NULL。它仅检查子查询中是否存在行,因此它只能返回true或false。

您可以使用EXCEPT

SELECT SectionAccess.Link,SectionAccess.UserID,AdminConsole.PPMID,AdminConsole.EPRID,AdminConsole.Proj_Name FROM SectionAccess INNER JOIN AdminConsole ON SectionAccess.Link = AdminConsole.Link

除非

SELECT SectionAccess.Link,SectionAccess.UserID,AdminConsole.PPMID,AdminConsole.EPRID,AdminConsole.Proj_Name FROM SectionAccess INNER JOIN AdminConsole ON SectionAccess.Link = AdminConsole.Link 在哪里SectionAccess.UserID喜欢('%" +请求[" UserID"] +"%');

答案 2 :(得分:0)

您要在子查询中再次加入 AdminConsole ,而应从主查询中通过 AdminConsole 进行过滤。

您的查询未请求您想要的内容:

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole
WHERE NOT EXISTS 
(SELECT SectionAccess.Link, SectionAccess.UserID, AdminConsole.PPMID, AdminConsole.EPRID, AdminConsole.Proj_Name FROM SectionAccess 
INNER JOIN AdminConsole ON SectionAccess.Link=AdminConsole.Link 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "');

如果用户至少有一个项目,则子查询会传递行。因此,不存在是错误的,在这种情况下,您将不会从 AdminConsole 获得任何行。

您必须按主要查询 AdminConsole.Link 过滤子查询。类似的东西:

SELECT Link, PPMID, EPRID, Proj_Name FROM AdminConsole
WHERE NOT EXISTS 
(SELECT SectionAccess.Link, SectionAccess.UserID FROM SectionAccess 
WHERE SectionAccess.UserID = '" + Request["UserID"] + "' and
   SectionAccess.Link=AdminConsole.Link);