2010-12-29 48 views
8

Tôi có bảng có thuộc tính dựa trên khóa-giá trị. Ví dụ:Máy chủ SQL PIVOT trên bảng khóa-giá trị

CREATE TABLE ObjectAttributes 
(
    int objectId, key nvarchar(64), value nvarchar(512) 
) 

Khi tôi lựa chọn tuyệt vời này, tôi nhận được:

objectId key  value 
---------------------------- 
1   Key 1 Value 1 
1   Key 2 Value 2 

tôi đã tự hỏi nếu tôi có thể sử dụng cú pháp PIVOT để tắt chức năng này vào:

objectId Key 1  Key 2 
--------------------------- 
1   Value 1 Value 2 

Tôi biết tất cả các bảng của tôi sẽ có cùng các khóa. (Thật không may là tôi không thể dễ dàng thay đổi cấu trúc bảng. Đây là điều khiến tôi cố gắng sử dụng PIVOTS).

Vấn đề lớn ở đây là các trụ yêu cầu phải sử dụng chức năng tổng hợp. Có cách nào để ngăn chặn điều này không? Tôi hoàn toàn sai khi cố gắng điều này? Hoặc là có một giải pháp tốt hơn?

+0

Bạn có muốn đầu ra cột cố định không? Nghĩa là, bạn muốn xoay quanh tất cả các khóa cho objectid đã cho? – gbn

Trả lời

7

Trục sẽ không tự động lặp lại nhanh hơn khi kết nối với đầu ra cột cố định.

SELECT 
    T1.objectID, T1.Value AS Key1, T2.Value AS Key2 
FROM 
    ObjectAttributes T1 
    JOIN 
    ObjectAttributes T2 ON T1.objectID = T2.objectID 
WHERE 
    T1.key = 'Key 1' 
    AND 
    T2.key = 'Key 2' 

Nếu bạn muốn sử dụng PIVOT, thì chỉ cần sử dụng MAX. Bởi vì bạn có một hàng cho mỗi đối tượng/khóa, nó là tầm thường và có để đáp ứng yêu cầu PIVOT.

Nếu bạn muốn PIVOT một số không rõ số hàng thành cột, thì đó là SQL động (theo giải pháp SQL Server 2000) hoặc thực hiện trong mã máy khách.

Nếu mỗi đối tượng có một số thuộc tính cố định thì tôi sẽ xem xét có một bảng thứ hai với các cột thực được duy trì bởi trình kích hoạt. Vụng về, nhưng làm cho cuộc sống dễ dàng hơn để đọc

+0

Ah ok. Tôi đã giả định rằng bảng tổng hợp có một số loại ma thuật đằng sau nó khiến nó nhanh hơn. Tôi sẽ chỉ đi với con đường tự tham gia. – Kyle

+0

Bạn có thể muốn sử dụng các kết nối bên ngoài cho giải pháp này. Nếu bạn thiếu một khóa thì toàn bộ hàng của các đối tượng đầu ra sẽ biến mất với các kết nối bên trong được sử dụng ở đây. –

+0

@Sir Wobin: và di chuyển bộ lọc đến JOIN quá ... – gbn

5

Không, bạn không thể tránh tổng hợp. SQL Server cần một số cách để kết hợp nhiều hàng có thể thành một giá trị. Bạn có một giá trị nhưng chức năng PIVOT được thực hiện với nhiều hàng trong đầu.

SELECT objectId, [Key 1], [Key 2] 
FROM 
(SELECT objectId, [key], value FROM ObjectAttributes) AS source 
PIVOT 
(
MIN(value) 
FOR [key] IN ([Key 1], [Key 2]) 
) as pvt 
Các vấn đề liên quan