我是 SQL 新手,我想实现以下查询:
我有两张桌子,LicenseTbl
并且UnlockTbl
:
LicenseTbl
包含有关购买的软件许可证的信息:
LicenseID, ProgramID, Owner, Location, OrderNo, BlockTime
UnlockTbl
包含有关特定软件注册的信息:
UnlockID、LicenseID(LicenseTbl 中的外键)、Timestamp、SerialNo、Key、UninstallTime
其中 BlockTime 和 UninstallTime 包含一个时间戳,如果许可证被阻止或软件被卸载等等NULL
。
我想设计一个查询,为我提供满足以下条件的所有 LicenseID:
- 属于给定的客户,
- 没有被封锁,
- 未在 UnlockTbl 中列出,或者在未标记为已卸载的行中有 < X 个不同的 SerialNo。
我已经写了这个,但我不确定它是否绝对正确(这是我的第一个 SQL 查询之一):
SELECT LicenseID FROM LicenseTbl
JOIN UnlockTbl
ON (LicenseTbl.LicenseID = UnlockTbl.LicenseID)
WHERE LicenseTbl.OrderNo = '$givenOrderNo'
AND LicenseTbl.Owner = '$givenOwner'
AND LicenseTbl.Location = '$givenLocation'
AND LicenseTbl.BlockTime IS NULL
AND UnlockTbl.UninstallTime IS NULL
GROUP BY LicenseTbl.LicenseID, UnlockTbl.Key
HAVING COUNT(*) < $X
(这应该意味着,列出同时使用少于 X 次的所有许可证。我更喜欢那些首先使用最少但不知道如何排序的许可证。)