【问题标题】:SQLite Query testing for multiple row matches多行匹配的 SQLite 查询测试
【发布时间】:2018-09-07 13:26:22
【问题描述】:

我在尝试查询这个时有点卡住: 查找与客户编号 250 相同的所有客户

数据库架构:

Customers(
customerNumber INTEGER, PRIMARY KEY
);

Orders(
orderNumber INTEGER, PRIMARY KEY
customerNumber INTEGER NOT NULL,
FOREIGN KEY (customerNumber) REFERENCES Customers
);

OrderDetails (
  orderNumber INTEGER NOT NULL,
  productCode TEXT NOT NULL,
  PRIMARY KEY (orderNumber, productCode),
  FOREIGN KEY (productCode) REFERENCES Products
);

我想出了查询:

select DISTINCT customerNumber
  FROM Orders Natural 
  JOIN OrderDetails
 WHERE productCode NOT IN (
    select productCode
    FROM Orders NATURAL JOIN OrderDetails
    WHERE customerNumber = 219
)    
order by customerNumber;

会是正确的,但它什么也没返回,所以很明显我误解了一些东西。

【问题讨论】:

  • 250 还是 219 ...?
  • 对不起250,混合了一些数字,查询中应该是250
  • 这个选择查询让我觉得除了 customerNumber = 250 之外还有更多规则
  • 所以如果客户 250 订购了产品 A、B 和 C,客户 300 订购了 A 和 B,客户 400 订购了 A、B 和 C,客户 500 订购了 A、B、C 和D. 你想展示哪些客户?是关于至少一种产品的共同点吗?所有 250 的产品?完全相同的产品?
  • 一旦有有用的答案,请不要破坏/删除您的问题,它可能对未来的访问者有用。

标签: sql sqlite subquery


【解决方案1】:

由于您需要所有客户,因此订购了 250 个或超过 250 个但具有相同产品的所有产品,因此尝试使用条件聚合

   select customerNumber
      FROM Orders o
      JOIN OrderDetails od 
     on o.orderNumber =od.orderNumber 
     WHERE od.productCode IN (
        select productCode
        FROM Orders o
       JOIN OrderDetails od 
       on o.orderNumber =od.orderNumber
        WHERE customerNumber = 250
    )    
     group by customerNumber
    having count(distinct productCode )>= 
        (select count(distinct productCode )
        FROM Orders o
       JOIN OrderDetails od 
       on o.orderNumber =od.orderNumber
        WHERE customerNumber = 250)

【讨论】:

  • 仅供参考,您在这段代码中的括号数量是奇数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多