繁体   English   中英

哪里有比赛

[英]Where if there's a match

我有一个要从中选择的表,该表从登录名中记录“签名”。

该表如下所示:

| Int| VARCHAR  | Guid   | Bit    | Int |  NVARCHAR(MAX)
| ID | UserName | UserId | Signed | Rec | additional info etc...
| -- | -------- | ------ | ------ | --- | ---------------------
| 1  | Bob      | 12     | 0      | 100 | sasdd
| 2  | Steve    | 14     | 1      | 100 | asretg
| 3  | GROUP: 2 | 76     | 0      | 101 | This is a group of logins
| 4  | Bob      | 12     | 1      | 101 | asdfasd

因此,第5列是对其进行签名的目标ID。

为特定用户(Bob)建立未签名项目的列表非常简单:

SELECT Rec FROM tbl_Sigs WHERE Signed = 0 And UserId = '12'

现在,我已将登录组添加到此列表中,如第3项所示-在此示例中,该组中既包含登录名,又能够在代码中从登录名中拉出它有权访问的组,因此语句变为:

SELECT Rec FROM tbl_Sigs WHERE (Signed = 0 And UserId = '12')
    OR UserId IN (76,77,78)

这可行,但是在示例中将选择记录100101

我只想为Bob选择记录100 ,因为由于“ GROUP:2”(我将始终是未签名的),所以我有101个匹配项,但是“ Bob”已经对记录101了签名,因此不需要在他的清单中。

我不知道如何将该条件放入where子句中,但是一旦有了数据集,我就可以在C#中完成,但如果可能的话,我更喜欢纯SQL方法。

我认为您只需要一个NOT EXISTS子句?

DECLARE @tbl_Sigs TABLE (
    ID INT,
    UserName VARCHAR(50),
    UserId INT, --Not a GUID!
    Signed BIT,
    Rec INT,
    AdditionalInfo VARCHAR(MAX));
INSERT INTO @tbl_Sigs VALUES (1, 'Bob', 12, 0, 100, 'sasdd');
INSERT INTO @tbl_Sigs VALUES (2, 'Steve', 14, 1, 100, 'asretg');
INSERT INTO @tbl_Sigs VALUES (3, 'GROUP: 2', 76, 0, 101, 'This is a group of logins');
INSERT INTO @tbl_Sigs VALUES (4, 'Bob', 12, 1, 101, 'asdfasd');
--So column 5 is the target ID to which it's been signed.
--To build a list of unsigned items for a specific user (Bob) was pretty straight forward:
SELECT Rec FROM @tbl_Sigs WHERE Signed = 0 And UserId = '12';

--Now, I've added login groups to this list, as in item 3 - In this example, the group has both logins in it and I'm able in code to pull from the login, which group it has access to, so the statement becomes:
SELECT Rec FROM @tbl_Sigs r1 WHERE (Signed = 0 And UserId = '12') OR UserId IN (76, 77, 78)
AND NOT EXISTS (SELECT * FROM @tbl_Sigs r2 WHERE r2.Rec = r1.Rec AND r2.UserId = '12' AND r2.Signed = 1);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM