Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.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
SQL EXISTS返回所有行,多于两个表_Sql_Subquery_Exists_Correlated Subquery - Fatal编程技术网

SQL EXISTS返回所有行,多于两个表

SQL EXISTS返回所有行,多于两个表,sql,subquery,exists,correlated-subquery,Sql,Subquery,Exists,Correlated Subquery,我知道以前也有人问过类似的问题,但我在两张以上的表格中都没有看到。这似乎是有区别的 我有三个表,我需要字段,customers我需要customerID和orderID从中,orders我从中获得customerID和orderID和数量(=订购数量) 我想了解有多少客户购买了2件以上的相同商品,因此基本上数量>2,包括: SELECT COUNT(DISTINCT custID) FROM customers WHERE EXISTS( SELECT * FROM custo

我知道以前也有人问过类似的问题,但我在两张以上的表格中都没有看到。这似乎是有区别的

我有三个表,我需要字段,
customers
我需要
customerID
orderID
从中,
orders
我从中获得
customerID
orderID
数量(=订购数量)

我想了解有多少客户购买了2件以上的相同商品,因此基本上数量>2,包括:

SELECT COUNT(DISTINCT custID) 
FROM customers
WHERE EXISTS(
    SELECT *
    FROM customers C, orders O, lineitems L
    WHERE C.custID = O.custID AND O.orderID = L.orderID AND L.quantity > 2
    );
我不明白为什么它会返回所有行的计数。我在检查>2条件之前关联子查询,不是吗


我是SQL的初学者,所以如果您能在必要时从根本上向我解释一下,我将不胜感激。谢谢。

您不必重复
EXISTS
子查询中的
customers
表。这就是关联的概念:使用外部查询的表来关联

SELECT COUNT(DISTINCT custID) 
FROM customers c
WHERE EXISTS(
    SELECT *
    FROM orders O
    JOIN lineitems L ON O.orderID = L.orderID
    WHERE C.custID = O.custID AND L.quantity > 2
    );

您不必在
EXISTS
子查询中重复
customers
表。这就是关联的概念:使用外部查询的表来关联

SELECT COUNT(DISTINCT custID) 
FROM customers c
WHERE EXISTS(
    SELECT *
    FROM orders O
    JOIN lineitems L ON O.orderID = L.orderID
    WHERE C.custID = O.custID AND L.quantity > 2
    );

我将把这看作两个聚合:

select count(distinct customerid)
from (select o.customerid, l.itemid, count(*) as cnt
      from lineitems li join
           orders o
           on o.orderID = l.orderId
      group by o.customerid, l.itemid
     ) ol
where cnt >= 2;
内部查询统计每个客户已购买的商品数量。外部统计客户数量

编辑:

对于上述答案,我可能误解了这个问题。如果您只想要
数量>=2
,那么这就容易多了:

select count(distinct o.customerid)
from lineitems li join
     orders o
     on o.orderID = l.orderId
where l.quantity >= 2;

这可能是表达查询的最简单方式。

我将其作为两个聚合:

select count(distinct customerid)
from (select o.customerid, l.itemid, count(*) as cnt
      from lineitems li join
           orders o
           on o.orderID = l.orderId
      group by o.customerid, l.itemid
     ) ol
where cnt >= 2;
内部查询统计每个客户已购买的商品数量。外部统计客户数量

编辑:

对于上述答案,我可能误解了这个问题。如果您只想要
数量>=2
,那么这就容易多了:

select count(distinct o.customerid)
from lineitems li join
     orders o
     on o.orderID = l.orderId
where l.quantity >= 2;
这可能是表达查询的最简单方式。

我建议您使用“连接”

试试这个

挑选 计数(*) 从…起 命令 内连接 行项目l 在…上 l、 orderID=o.orderID 哪里 l、 数量>2

我建议您使用“连接”

试试这个

挑选 计数(*) 从…起 命令 内连接 行项目l 在…上 l、 orderID=o.orderID 哪里
l、 数量>2

那么该错误是由于再次重复客户而导致的?或者使用
JOIN
而不是
FROM。。。其中…
在使用多个表时也会产生影响?@sandboxj是的错误是由于表
客户
再次被使用:这超出了相关性的概念。最好使用现代的
JOIN
语法,如上面的查询中所示,而不是使用逗号分隔表的旧式语法?或者使用
JOIN
而不是
FROM。。。其中…
在使用多个表时也会产生影响?@sandboxj是的错误是由于表
客户
再次被使用:这超出了相关性的概念。最好使用现代的
JOIN
语法,如上面的查询,而不是使用逗号分隔表的旧式语法。