Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
与MySql中另一个表中列出的每个不同值进行比较_Mysql_Sql_Database - Fatal编程技术网

与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查询将转换为从客户没有的帐户表中选择帐户类型不存在的所有客户(换句话说,客户拥有所有类型的帐户)