SQL:连接两个表,其中一个表具有不同的行

标签 sql sql-server-2008 t-sql join

这可能是一个非常简单的问题,但自从昨晚以来我似乎无法解决这个问题。

我有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/

相关文章:

c# - PetaPoco 存储过程错误 "Incorrect syntax near the keyword ' FROM'。"}

sql - 如何在给定表列表的情况下识别未使用/冗余的列?

python - 在数据库中查找 'representative'组数据

sql - Oracle SQL 19c中如何获取日期对应的季度

sql-server - Mongodb ObjectId 生成器作为 SQL Server proc

sql-server-2008 - TIFF IFilter 无法正确读取 VARBINARY 列中的文本

sql - 当订单列具有相同数据时,OrderBy 子句会产生不同的结果集

sql - 如何从 SQL Server 中的 SELECT 进行更新 - 如果选择返回多个项目(跟进问题 2334712)

sql-server - 在sql server中将 “&lt;”和 “&gt;”和 "&lt;\"替换为 “<” ,“>”和</

sql - 如何在不切断底部联系的情况下使用 Django Queryset 查找列中的 top-X 最高值?