如何在SQL语句的WHERE子句中使用JOIN查询符合要求的商户数据?
SQL查询问题解答
原有语句错误说明
你编写的语句无法运行主要有以下几个问题:
- 未关联Merchants和Tokens两张表,不能直接在WHERE子句中引用未出现在FROM列表的表字段
- 日期格式书写错误,未用引号包裹的
8/30/2021会被数据库识别为除法运算,无法正确匹配日期条件 - 缺少去重逻辑,同一个商户如果匹配到多条符合条件的token会返回重复结果
- 额外加了
LIMIT 1限制,只会返回1条结果,不符合查询所有符合条件商户的需求
实现方案
方案1:推荐使用显式INNER JOIN写法(可读性更高,逻辑更清晰)
SELECT DISTINCT m.Name, m.JoinDate FROM Merchants m INNER JOIN Tokens t ON m.Id = t.MerchantId -- 两张表通过商户ID关联 WHERE m.JoinDate > '2020-01-01' -- 筛选2020年1月1日后入驻的商户 AND t.TokenType = 1 -- 筛选inactive类型的token AND t.InsertDate > '2021-08-30' -- 筛选2021年8月30日后生成的token
说明:
DISTINCT关键字用来对返回的商户数据去重- 日期使用标准
'YYYY-MM-DD'格式加单引号包裹,兼容绝大多数数据库 - 显式JOIN把关联逻辑和过滤逻辑拆分,不容易出现漏写关联条件的错误
方案2:WHERE子句隐式关联写法(对应你想在WHERE中实现关联的需求)
这是较早的SQL语法,将表关联条件直接写在WHERE子句中,执行效果和方案1完全一致:
SELECT DISTINCT m.Name, m.JoinDate FROM Merchants m, Tokens t WHERE m.Id = t.MerchantId -- 表关联条件,等价于方案1的INNER JOIN ON AND m.JoinDate > '2020-01-01' AND t.TokenType = 1 AND t.InsertDate > '2021-08-30'
补充注意事项
- 由于Merchants表的
JoinDate字段是nvarchar类型,如果它的存储格式不是YYYY-MM-DD这类可以直接按字符串比较大小的格式,需要先转成日期类型再做判断:- SQL Server可以用
CONVERT(DATE, m.JoinDate, 格式编码) > '2020-01-01' - MySQL可以用
STR_TO_DATE(m.JoinDate, '存储格式字符串') > '2020-01-01'
- SQL Server可以用
内容的提问来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

