2014-04-04 63 views
0

我很努力地爲父客戶端記錄進行SQL連接(字面上在我的示例中!)。我的數據庫表是由類似的東西組成(請原諒這個非常通用的例子)。SQL加入子記錄

Table Room 
Room No 
    1 
    2 
    3 

Table Customer 
| Customer ID | Customer Name  | Associated 
| 1  | Joe Bloggs  | 
| 2  | Little Bloggs  | 1 
| 3  | Little bloggs pet | 2 

Table Bookings 
| Room No | Customer | 
| 1  | 1  | 

我後,一些SQL搶滿3個層次和客房例如

Room Customer 
1  Joe Bloggs 
1  Little Bloggs 
1  Little Bloggs pet 

心不是客戶2和3的直接參與,但他們可以通過用戶1繼承室1

回答

2

你應該能夠做到這一點使用遞歸CTE

類似下面

;WITH Vals AS (
     SELECT CustomerID, 
       CustomerName, 
       b.Room 
     FROM Customer c INNER JOIN 
       Bookings b ON c.CustomerID = b.Customer 
     UNION ALL 
     SELECT c.CustomerID, 
       c.CustomerName, 
       v.Room 
     FROM Vals v INNER JOIN 
       Customer c ON c.Associated = v.CustomerID 
) 
SELECT * 
FROM Vals 
1
;with Cte (RoomId,Name ,CustomerId) 
as(
    Select R.RoomId,C.Name,C.CustomerId 
    From Booking B 
    Inner Join Customer C on C.CustomerId=B.Customer 
    Inner Join Room R On R.RoomId=B.RoomNo 
    Union All 
    Select Cte.RoomId,Cus.Name,Cus.CustomerId 
    From Customer Cus 
     inner join Cte On Cte.CustomerId=Cus.Associated 
) 

Select RoomId,Name from Cte 

更多Recursive Queries Using Common Table Expressions

0

你可以做到這一點使用CTE,請檢查SQLFiddle

提供了下面的CTE部分樣品,請注意,已將其更名爲AssociatedAssociatedCustomerID使其更有意義:

WITH CTE AS 
( SELECT *, 0 [Level] 
    FROM Customer 
    UNION ALL 
    SELECT CTE.CustomerID, CTE.CustomerName, Customer.AssociatedCustomerID, Level + 1 
    FROM CTE 
      INNER JOIN Customer 
       ON CTE.AssociatedCustomerID = Customer.CustomerID 
    WHERE Customer.AssociatedCustomerID IS NOT NULL 
) 

SELECT c.CustomerID, c.CustomerName, c.AssociatedCustomerID AssociatedCustomerID , Bookings.RoomID 
FROM ( SELECT *, MAX([Level]) OVER (PARTITION BY CustomerName) [MaxLevel] 
      FROM CTE 
     ) c 
INNER JOIN Bookings on ISNULL(c.AssociatedCustomerID,c.CustomerID) = Bookings.CustomerID 
WHERE MaxLevel = Level