2013-07-10 106 views
2

這可能是一個非常簡單的問題,但自從昨晚以來似乎無法解決這個問題。SQL:從一張表中加入兩個不同行的表格

我有3個表

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和許可使用使用產品表產品名稱和產品編號映射接合。

我想獲得VirtualLicenseId和LicenseId的組合,我基本上可以將VirtualLicenseId分配給LicenseId。一旦將licenseid分配給VirtualLicenseId,它就不應該可用於以下VirtualLicenseIds。另外,我希望expirydate更接近(更小)的licenseid應該首先分配。

所以,我的例子中數據集的結果應該是

VirtualLicenseId LicenseId 
--------------------------------- 
1     2 
2     3 
3     1 

我不想遍歷任何這樣做的表。 我希望我的問題從我的描述和數據中清楚。

回答

2

你可以做這樣的事情:

  • 在第一CTE - 分配排名爲產品組內VirtualLicenses。
  • 在第二個CTE中 - 爲產品組中的Licensce指定排名(按期限排序)
  • 最後,只需在productID和排名上加入兩個子查詢。

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