使用Join仅显示没有匹配外键的记录

时间:2015-12-22 18:08:09

标签: sql-server

我一整天都在这里工作,尝试了多个网站的多个建议,我似乎无法解决这个问题!

我正在使用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

3 个答案:

答案 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。我遗漏了从useraccountaccount的第二次加入。完整的选择应该是:

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