与MySql中另一个表中列出的每个不同值进行比较
我有下面两张桌子 表:客户与MySql中另一个表中列出的每个不同值进行比较,mysql,sql,database,Mysql,Sql,Database,我有下面两张桌子 表:客户 Cust_ID FName ------- ----- 1 X 2 Y 3 Z 表:账户 Acct_Number Cust_ID Acct_Type ----------- ------- --------- 1001 1 savings 1002 1 capital 1003 2
Cust_ID FName
------- -----
1 X
2 Y
3 Z
表:账户
Acct_Number Cust_ID Acct_Type
----------- ------- ---------
1001 1 savings
1002 1 capital
1003 2 savings
1004 2 capital
1005 2 vip
1006 3 capital
1007 3 vip
账户表中有三种不同类型的账户(储蓄、资本和vip),我想找到拥有账户关系中列出的每种类型账户的客户(不使用任何聚合运算符)。也就是说,在这种情况下,Y将符合条件,因为他是唯一拥有所有类型账户的客户
我得到一个建议,尝试以下方法,但不起作用:
SELECT c.FName, c.Cust_ID FROM Customer AS c
JOIN Account AS a1 ON c.Cust_ID = a1.Cust_ID
JOIN Account AS a2 ON c.Cust_ID = a2.Cust_ID
WHERE a1.Acct_Type <> a2.Acct_Type;
从客户中选择c.FName、c.Cust\u ID作为c
在c.Cust\u ID=a1.Cust\u ID上以a1身份加入帐户
在c.Cust\u ID=a2.Cust\u ID上以a2身份加入帐户
式中a1.会计类型a2.会计类型;
上面的查询给出的客户帐户有两种不同的类型,而不是全部。非常感谢您的帮助。这里有一个使用
不存在的查询
select c.* from customer c
where not exists (
select acct_type from account a2
where acct_type not in (
select distinct acct_type
from account a3 where a3.Cust_ID = c.Cust_ID
)
)
这里有一个使用
不存在的查询
select c.* from customer c
where not exists (
select acct_type from account a2
where acct_type not in (
select distinct acct_type
from account a3 where a3.Cust_ID = c.Cust_ID
)
)
编辑:如果以前不知道
账户类型
值,可以使用以下查询获得所需结果。显然,这比使用聚合操作要繁琐得多
SELECT c.*
FROM Customer AS c
INNER JOIN
(
SELECT DISTINCT
all_combinations.Cust_ID
FROM Account Acct
RIGHT JOIN
(
SELECT
c.Cust_ID,
a.Acct_Type
FROM Customer AS c
CROSS JOIN
(SELECT DISTINCT Acct_Type FROM Account) AS a
) all_combinations
ON Acct.Cust_ID = all_combinations.Cust_ID AND Acct.Acct_Type = all_combinations.Acct_Type
WHERE Acct.Cust_ID IS NOT NULL
) all_acct_types
ON c.Cust_ID = all_acct_types.Cust_ID;
编辑:如果以前不知道
账户类型
值,可以使用以下查询获得所需结果。显然,这比使用聚合操作要繁琐得多
SELECT c.*
FROM Customer AS c
INNER JOIN
(
SELECT DISTINCT
all_combinations.Cust_ID
FROM Account Acct
RIGHT JOIN
(
SELECT
c.Cust_ID,
a.Acct_Type
FROM Customer AS c
CROSS JOIN
(SELECT DISTINCT Acct_Type FROM Account) AS a
) all_combinations
ON Acct.Cust_ID = all_combinations.Cust_ID AND Acct.Acct_Type = all_combinations.Acct_Type
WHERE Acct.Cust_ID IS NOT NULL
) all_acct_types
ON c.Cust_ID = all_acct_types.Cust_ID;
您需要的是关系划分:
forall x:p(x)
但这不可能用sql表示,因此您必须将其重写为:
not exists x : not p(x)
换言之,对于不存在帐户类型的客户,该帐户不存在帐户类型。比如:
SELECT c.FName, c.Cust_ID
FROM Customer AS c
WHERE NOT EXISTS (
select distinct Acct_Type
from Account t
where not exists (
select 1 from Account as a
where a.cust_id = c.cust_id
and a.Acct_Type = t. Acct_Type
)
);
编辑:没有注意到不允许聚合您想要的是关系划分:
forall x:p(x)
但这不可能用sql表示,因此您必须将其重写为:
not exists x : not p(x)
换言之,对于不存在帐户类型的客户,该帐户不存在帐户类型。比如:
SELECT c.FName, c.Cust_ID
FROM Customer AS c
WHERE NOT EXISTS (
select distinct Acct_Type
from Account t
where not exists (
select 1 from Account as a
where a.cust_id = c.cust_id
and a.Acct_Type = t. Acct_Type
)
);
编辑:没有注意到不允许聚合没有聚合函数,是吗?为什么不呢?我得去纽约市。我的汽车爆胎了。我不想修理它。如果我开着我的车,去纽约最好的方式是什么?没有表格列出所有可能的账户类型?气味难闻。@Cylindric上述问题与我正在学习的一门数据库课程有关,问题背后的主要思想是练习集合论、关系代数和域微积分,我想这就是为什么解决方案必须保持非聚合无聚合函数的原因,嗯?为什么不呢?我得去纽约市。我的汽车爆胎了。我不想修理它。如果我开着我的车,去纽约最好的方式是什么?没有表格列出所有可能的账户类型?气味难闻。@Cylindric上述问题与我正在学习的一门数据库课程有关,问题背后的主要思想是练习集合论、关系代数和域微积分,我想这就是为什么解决方案必须保持每种类型的非聚合帐户-这意味着用户不知道帐户类型或不同帐户的数量。请参阅上面修改的答案,它处理以前未知的帐户类型值。每种类型的帐户-意味着用户不知道帐户类型或不同帐户的数量。请参阅上面修改的答案,它处理以前未知的帐户类型值。@rubiksKube更新的答案为use not exists而不是countsimply great,现在,我正在尝试理解解决方案。Thanks@rubiksKube查询转换为从客户没有的帐户表中选择帐户类型不存在的所有客户(换句话说,该客户拥有所有类型的帐户)@rubiksKube update answer to use not exists而不是countsimply great,现在正在尝试了解解决方案。Thanks@rubiksKube查询将转换为从客户没有的帐户表中选择帐户类型不存在的所有客户(换句话说,客户拥有所有类型的帐户)