Tôi đang làm việc trên cơ sở dữ liệu nội dung có phân cấp. Ngoài ra, có một bảng "ReferenceAsset", có hiệu quả chỉ trở lại một tài sản. Tài sản tham chiếu về cơ bản hoạt động như một ghi đè, nhưng nó được chọn như thể nó là một tài sản mới duy nhất. Một trong các ghi đè được đặt, là parent_id.Máy chủ SQL: truy vấn dữ liệu phân cấp và tham chiếu
Cột có liên quan đến việc lựa chọn các hệ thống cấp bậc:
Asset: id (tiểu học), PARENT_ID
Asset tham khảo: id (tiểu học), asset_id (foreignkey-> Asset), PARENT_ID (luôn là một tài sản)
- --EDITED 5/27 ----
mẫu có liên quan Bảng dữ liệu (sau khi tham gia):
id | asset_id | name | parent_id | milestone | type 3 3 suit null march shape 4 4 suit_banker 3 april texture 5 5 tie null march shape 6 6 tie_red 5 march texture 7 7 tie_diamond 5 june texture -5 6 tie_red 4 march texture
sự id < 0 (giống như hàng cuối cùng) biểu thị các tài sản được tham chiếu. Tài sản được tham chiếu có một vài cột bị ghi đè (trong trường hợp này, chỉ có parent_id là quan trọng).
Hi vọng là nếu tôi chọn toàn bộ tài sản từ tháng tư, tôi nên làm một lựa chọn thứ để có được toàn bộ cành cây của truy vấn phù hợp:
vì thế ban đầu trận đấu truy vấn sẽ cho kết quả:
4 4 suit_banker 3 april texture
sau đó, sau khi CTE, chúng tôi nhận được hệ thống phân cấp đầy đủ và kết quả của chúng tôi phải được điều này (cho đến nay đây là làm việc)
3 3 suit null march shape 4 4 suit_banker 3 april texture -5 6 tie_red 4 march texture
và bạn thấy, phụ huynh của id: -5 là có, nhưng những gì là mất tích, đó là cần thiết, là tài sản tham chiếu, và phụ huynh của các tài sản tham chiếu:
5 5 tie null march shape 6 6 tie_red 5 march texture
Hiện tại giải pháp của tôi hoạt động cho điều này, nhưng nó chỉ giới hạn ở một độ sâu tham chiếu duy nhất (và tôi cảm thấy việc triển khai khá xấu).
--- Đã chỉnh sửa ---- Đây là chức năng lựa chọn chính của tôi. Điều này sẽ chứng minh tốt hơn nơi mà các biến chứng thực sự nằm ở: AssetReference.
Select A.id as id, A.id as asset_id, A.name,A.parent_id as parent_id, A.subPath, T.name as typeName, A2.name as parent_name, B.name as batchName,
L.name as locationName,AO.owner_name as ownerName, T.id as typeID,
M.name as milestoneName, A.deleted as bDeleted, 0 as reference, W.phase_name, W.status_name
FROM Asset as A Inner Join Type as T on A.type_id = T.id
Inner Join Batch as B on A.batch_id = B.id
Left Join Location L on A.location_id = L.id
Left Join Asset A2 on A.parent_id = A2.id
Left Join AssetOwner AO on A.owner_id = AO.owner_id
Left Join Milestone M on A.milestone_id = M.milestone_id
Left Join Workflow as W on W.asset_id = A.id
where A.deleted <= @showDeleted
UNION
Select -1*AR.id as id, AR.asset_id as asset_id, A.name, AR.parent_id as parent_id, A.subPath, T.name as typeName, A2.name as parent_name, B.name as batchName,
L.name as locationName,AO.owner_name as ownerName, T.id as typeID,
M.name as milestoneName, A.deleted as bDeleted, 1 as reference, NULL as phase_name, NULL as status_name
FROM Asset as A Inner Join Type as T on A.type_id = T.id
Inner Join Batch as B on A.batch_id = B.id
Left Join Location L on A.location_id = L.id
Left Join Asset A2 on AR.parent_id = A2.id
Left Join AssetOwner AO on A.owner_id = AO.owner_id
Left Join Milestone M on A.milestone_id = M.milestone_id
Inner Join AssetReference AR on AR.asset_id = A.id
where A.deleted <= @showDeleted
Tôi có một thủ tục được lưu trữ có bảng tạm thời (#temp) và tìm tất cả các phần tử của cấu trúc phân cấp.Chiến lược tôi làm việc là thế này:
- Chọn hệ thống toàn bộ hệ thống cấp bậc vào một bảng tạm thời (#treeIDs) đại diện bởi một dấu phẩy tách ra danh sách của mỗi toàn bộ cành cây
- Nhận toàn bộ hệ thống cấp bậc của tài sản phù hợp với truy vấn (từ # temp)
- Nhận toàn bộ tài sản tài liệu tham khảo được trỏ đến bởi tài sản từ hệ thống cấp bậc
- Phân tích các hệ thống cấp bậc của toàn bộ tài sản tham khảo
này làm việc cho bây giờ bởi vì tài sản tham khảo luôn là la st mục trên một chi nhánh, nhưng nếu họ không, tôi nghĩ rằng tôi sẽ gặp rắc rối. Tôi cảm thấy như tôi cần một hình thức đệ quy tốt hơn.
Đây là mã hiện tại của tôi, mà đang làm việc, nhưng tôi không tự hào về nó, và tôi biết nó không phải là mạnh mẽ (vì nó chỉ hoạt động nếu các tài liệu tham khảo là ở phía dưới):
Bước 1. xây dựng toàn bộ hệ thống phân cấp
;WITH Recursive_CTE AS (
SELECT Cast(id as varchar(100)) as Hierarchy, parent_id, id
FROM #assetIDs
Where parent_id is Null
UNION ALL
SELECT
CAST(parent.Hierarchy + ',' + CAST(t.id as varchar(100)) as varchar(100)) as Hierarchy, t.parent_id, t.id
FROM Recursive_CTE parent
INNER JOIN #assetIDs t ON t.parent_id = parent.id
)
Select Distinct h.id, Hierarchy as idList into #treeIDs
FROM (Select Hierarchy, id FROM Recursive_CTE) parent
CROSS APPLY dbo.SplitIDs(Hierarchy) as h
Bước 2. Chọn chi nhánh của toàn bộ tài sản phù hợp với truy vấn
Select DISTINCT L.id into #RelativeIDs FROM #treeIDs
CROSS APPLY dbo.SplitIDs(idList) as L
WHERE #treeIDs.id in (Select id FROM #temp)
Bước 3. Nhận tất cả các tài sản tham khảo trong các ngành.210 (tài sản có giá trị tham khảo id tiêu cực, vì thế mà id < 0 phần)
Select asset_id INTO #REFLinks FROM #AllAssets WHERE id in
(Select #AllAssets.asset_id FROM #AllAssets Inner Join #RelativeIDs
on #AllAssets.id = #RelativeIDs.id Where #RelativeIDs.id < 0)
Bước 4. Nhận các chi nhánh của bất cứ điều gì được tìm thấy trong bước 3
Select DISTINCT L.id into #extraRelativeIDs FROM #treeIDs
CROSS APPLY dbo.SplitIDs(idList) as L
WHERE
exists (Select #REFLinks.asset_id FROM #REFLinks WHERE #REFLinks.asset_id = #treeIDs.id)
and Not Exists (select id FROM #RelativeIDs Where id = #treeIDs.id)
Tôi đã cố gắng để chỉ hiển thị các mã có liên quan. Tôi rất biết ơn bất cứ ai có thể giúp tôi tìm ra giải pháp tốt hơn!
bạn đang sử dụng phiên bản sql nào? http://msdn.microsoft.com/de-de/library/bb677290.aspx – NickD
máy chủ sql 2012, nhưng chúng tôi vừa chuyển sang nó, vì vậy hầu hết điều này được viết cho 2008 – haggercody