我一整天都在这里工作,尝试了多个网站的多个建议,我似乎无法解决这个问题!
我正在使用MS SQL,我有3个SQL表,其中包含以下列:
USERS
------
UserID
UserAccounts
------------
UserID
AccountID
Accounts
--------
AccountID
这是diagram of tables(忽略数据类型,仅用于关系参考)
我需要检索一个帐户列表,其中Users表中的给定UserID在UserAccounts表中没有条目。
我遇到的问题是许多用户可以与许多相同的帐户相关联。例如,在UserAccounts表中,此数据有效:
UserAccounts
------------------
|UserID|AccountID|
------------------
| 1 | 1 |
| 2 | 1 |
| 2 | 3 |
因此,我无法使用" IS NULL"通过给定的用户名进行测试和过滤,使用"<> @用户ID"由于用户2与用户1不同,因此它仍然返回该行。
这有什么意义吗?我确实在我的智慧结束!
修改 我将查询更改为:
SELECT Accounts.ID, Accounts.CompanyAgencyName
FROM Accounts LEFT OUTER JOIN
(SELECT UserID, AccountID
FROM MyAccount.UserAccounts
WHERE (UserID = @UserID)) AS DerivedUserAccounts ON Accounts.ID = DerivedUserAccounts.AccountID
WHERE (DerivedUserAccounts.AccountID IS NULL)
ORDER BY Accounts.ID
答案 0 :(得分:1)
select * from accounts a where not exists (select * from UserAccounts where AccountID=a.AccountID and UserID=738)
其中738是给定的UserID。
答案 1 :(得分:1)
或者以更一般的形式
create table #user (uid int primary key);
create table #account (aid int primary key);
create table #useraccount (uauid int,uaaid int PRIMARY KEY (uauid,uaaid));
insert into #user VALUES (1),(2),(3),(4);
insert into #account VALUES (1),(2),(3),(4);
insert into #useraccount VALUES (1,1),(2,1),(2,3);
SELECT * FROM #user WHERE NOT EXISTS (SELECT 1 FROM #useraccount WHERE uauid=uid)
见here。我遗漏了从useraccount
到account
的第二次加入。完整的选择应该是:
SELECT * FROM #user WHERE NOT EXISTS
(SELECT 1 FROM #useraccount JOIN #account ON aid=uaaid WHERE uauid=uid)
答案 2 :(得分:1)
值为{1,2,3,4,5}的用户表
值为{10,20,30,40,50}的帐户表
UserAccount表,其值为{{1,20},{1,50},{2,20},{3,10},{4,40},{4,50}}
查询:
declare @userId int; set @userId = 4;
with cte ( userId, accountId ) as
(
select userId, accountId from userAccount where userId = @userId
)
select a.*
from
account a
left join cte b on ( a.Id = b.accountId )
where
( b.accountId is null )
结果:
10,20,30