我正在处理报告,这让我很紧张,因为我不能做简单的查询来排除订单表中不存在的用户。这应该是简单的查询,但我需要加入两个表。
Select User_ID, FirstName, Surname, UserType
FROM user
Left Join Order. ID ON Order.User_Id = User.User_ID
User_ID = Order_Ref WHERE Oder_Ref IS NULL
Where UserType ='Super'
现在我遇到报告,其中Order.User_ID具有varchar数据类型,遗憾的是,我无法创建正确提取数据的查询。正确的是因为我尝试使用isNumeric(Order.User_Id),使用正则表达式,WHERE Order.User_Id不喜欢'%[^ 0-9]%'和Order.User_Id!='',使用not exists语句。以上都没有真正帮助过。
目前我最终得到了:
Select User.User_Id, isNumeric(Order.Order_Id)
FROM User Left Join
Order
ON User.User_Id = Order.User_Id
WHERE (Order.Order_Id IS NULL AND ISNUMERIC(Order.Order_Id) = 1 AND User.UserType = 'Super')
此查询编译没有任何问题,但它不返回任何内容。 你能不能给我一个提示做什么的提示。
我真的很感谢你的帮助。
答案 0 :(得分:1)
更改
Left Join Order ON Order.User_Id = User.User_ID
到
inner Join Order ON Order.User_Id = User.User_ID
这会将结果限制为具有订单的用户。您发布的代码存在必须修复的语法错误。
答案 1 :(得分:1)
首先 - 如果user_id在[user]和[order]表中是相同的,那么它们应该具有相同的数据类型,应该强制执行参照完整性(例如,通过PK / FK关系)。我知道这可能不是你的电话。
下一步 - ISNUMERIC没有做到人们认为它做的事情。要理解我所说的运行这些查询并试图弄清楚ISNUMERIC真正做了什么:
select ISNUMERIC('$'), ISNUMERIC($), ISNUMERIC('$.,'), ISNUMERIC('$,'), ISNUMERIC('10,,0'), ISNUMERIC('');
select ISNUMERIC(''), cast('' as int), ''+2;
--select ISNUMERIC('$'), '$'+2; -- this errors, but is still worth runnning
对于你所描述的内容,我会使用子查询并在连接之前进行过滤,如下所示:
请注意,我提供了几种可以检查非数字字符的方法。
select [User].User_Id, isNumeric([Order].Order_Id)
from [User]
Left Join
(
select [order].Order_Id
from [order]
where [order].Order_Id NOT like '%[^0-9]%' -- contains only numbers
--where patindex('%[^0-9]%', [order].Order_Id) = 0
--where try_cast([order].Order_Id as int) is not null -- SQL Server 2012+
and [User].UserType = 'Super'
) [order]
on [User].User_Id = [order].User_Id