这可能是一个非常简单的问题,但自从昨晚以来我似乎无法解决这个问题。
我有3张 table
VirtualLicense
VirtualLicenseId ProductName
-----------------------------------
1 Transaction
2 Query
3 Transaction
Product
ProductId Name
---------------------------
1 Transaction
2 Query
License
LicenseId ExpiryDate ProductId
-----------------------------------------
1 14/07/2013 1
2 13/07/2013 1
3 13/07/2013 2
4 14/07/2013 2
VirtualLicense 和 License 通过 Product 表中的 ProductName 和 ProductId 映射进行连接。
我想要获得 VirtualLicenseId 和 LicenseId 的组合,基本上可以将 VirtualLicenseId 分配给 LicenseId。将许可证 ID 分配给 VirtualLicenseId 后,它不应可用于以下 VirtualLicenseId。另外,我希望应该首先分配到期日期较近(较小)的许可证ID。
因此,我的示例数据集的结果应该是
VirtualLicenseId LicenseId
---------------------------------
1 2
2 3
3 1
我不想为此循环任何表格。 我希望我的问题从我的描述和数据中可以清楚地看出。
最佳答案
你可以这样做:
- 在第一个 CTE 中 - 为产品组内的 VirtualLicense 分配排名。
- 在第二个 CTE 中 - 为产品组内的许可分配排名(按到期日期排序)
- 最后只需连接有关productID 和ranking 的两个子查询即可。
WITH CTE_VL AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId ORDER BY vl.VirtualLicenseId ASC) RN
FROM dbo.VirtualLicense vl
LEFT JOIN dbo.Product p ON vl.ProductName = p.Name
)
,CTE_License AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY ProductId ORDER BY ExpiryDate ASC) RN
FROM dbo.License
)
SELECT VirtualLicenseId, LicenseId
FROM CTE_VL vl
LEFT JOIN CTE_License l ON vl.ProductId = l.ProductID AND vl.RN = l.RN
<强> SQLFiddle DEMO
关于SQL:连接两个表,其中一个表具有不同的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17568760/