如何根据连接表连接的第二个表中的条件从一个表中获取记录

时间:2014-09-02 08:39:30

标签: sql sql-server-2008

我有两张表ClientsAccounts。每个客户可能有多个帐户,一个帐户可能与多个客户有关(在某些情况下),所以我有第三个表Clients_Accounts这是一个普通的连接表,因此相关部分是:

Clients   |   Accounts                 |  Clients_Accounts
Id(PK)    |   Id(PK); Amount(int)      |  Id(PK); ClientId(FK); AccountId(FK)

我坚持如何从Clients中选择数据,具体取决于他们在Accouts中的数量。例如Clients所有Amount >= 5000

我知道JOIN的基础知识,所以我可以到达附近的某处:

SELECT * 
FROM Clients AS c
INNER JOIN Clients_Accounts AS cs ON c.Id = cs.ClientId

这是我迷失的地方,因为我想获得与AccountId外键关联的金额,并检查它是否符合条件,以便我只获得与{ClientId's相关联的AccountId's 1}}数量大于5000,然后最终使用这些ID's最终从Client's表中选择Clients数据。

2 个答案:

答案 0 :(得分:2)

你能试试吗?

 SELECT * FROM Clients C
 JOIN Clients_Accounts CS
 ON c.Id = cs.ClientId
 JOIN Accounts A
 ON A.Id = cs.AccountId
 WHERE A.Amount > 5000

它基本上是一个+级别的连接,包括帐户的ID(在两个表中)。 这应该是您所需要的基础,但是由于多对多关系,您可能必须GROUP才能获得在多个客户端显示的帐户的累计总数

我提到的分组会看起来像这样,假设我已正确理解你的OP(我不确定,因为我还没有咖啡)

 SELECT c.id, SUM(a.amount) FROM Clients C
 JOIN Clients_Accounts CS
 ON c.Id = cs.ClientId
 JOIN Accounts A
 ON A.Id = cs.AccountId
 GROUP BY c.id, a.id
 HAVING SUM(a.amount) > 5000

我希望这会有所帮助! :)

答案 1 :(得分:2)

也许我在您的要求中遗漏了一些内容,但如果您想获得帐户金额> gt = 5000的客户列表,那么应该这样做:

SELECT * FROM Clients AS c
INNER JOIN Clients_Accounts AS cs
ON c.Id = cs.ClientId
INNER JOIN Accounts a 
ON a.Id = cs.AccountId
WHERE a.Amount >= 5000

当然,此列表可能包含帐户少于5000的客户,只要他们至少有一个> = 5000的帐户。如果您希望客户的总金额超过所有关联帐户> = 5000则您必须使用带有group byhaving子句的聚合函数。