mysql - MYSQL检查一个表中存在的每个项目是否存在于另一个表中
问题描述
如何检查一个表中的所有项目是否存在于另一个表中。例如,考虑以下两个表。
使用他们各自的查询:
SELECT orderID
FROM orders
WHERE customer_id = 1;
TABLE A
-------
orderID
2
1
6
4
SELECT orderID
FROM orders
WHERE customer_id = 2;
TABLE B
-------
orderID
5
1
7
9
我不想输出任何东西,因为表 A 中的所有项目都不存在于表 B 中。
但是,我必须:
SELECT orderID
FROM orders
WHERE customer_id = 3;
TABLE C
-------
orderID
5
我想输出它,因为表 C 中的所有项目都在表 B 中。
如果我要使用表 C 进行选择,我希望表 C 是输出。
我尝试了以下查询:
SELECT *
FROM (SELECT orderID
FROM orders
WHERE customer_id = 1) A
WHERE A.orderID IN (
SELECT orderID
FROM orders
WHERE customer_id = 2);
解决方案
如果您可以按客户检查,您可以这样做:
IF (NOT EXISTS
SELECT NULL
FROM orders
WHERE customer_id = 1 -- "Table A"
AND orderID NOT IN
-- "Table B"
(SELECT orderID
FROM orders
WHERE customer_id = 2)
)
SELECT orderID
FROM orders
WHERE customer_id = 1;
这里查询基本上是从表 A 中获取不在表 B 中的订单。如果没有,则在最后执行选择。否则,它什么也不做。
如果您customer_id = 3
改用,您将得到一行 orderID 为 5(“表 C”)的行。
推荐阅读
- azure - 使用哪一个?microsoft/azure-cli 与 mcr.microsoft.com/azure-cli
- c++ - 对已定义的接口析构函数的未定义引用
- java - 如何测试@Scheduled 注释方法
- deployment - 在本地网络上提供 PWA 而不显示或禁用不安全的连接警告?
- python - 提高数据帧移位效率
- java - 次要和主要 GC 周期
- c# - 如何从文件中解析日期并添加时区信息
- apache-spark - gcloud dataproc 作业提交 spark 以 root 用户身份提交作业
- r - 如何使 for 循环可选
- elasticsearch - 在单个搜索查询中获取令牌位置 ElasticSearch v7.3