Oracle 11g和Sql Server 2005+都包含一個pivot命令,可以實現您想要的功能。
http://www.orafaq.com/wiki/PIVOT
http://msdn.microsoft.com/en-us/library/ms177410.aspx
否則,你將需要建立一個動態的SQL語句來實現這一目標。
編輯 - 在這裏你去(SQL Server版本)。
/* Begin Set up of test data */
IF EXISTS (SELECT 1 from sys.tables WHERE name = N'Item')
DROP TABLE Item
GO
IF EXISTS (SELECT 1 from sys.tables WHERE name = N'CrossReference')
DROP TABLE CrossReference
GO
CREATE TABLE Item
(
Item varchar(20),
BasePart varchar(20),
Size varchar(20)
);
CREATE Table CrossReference
(
Item varchar(20),
CrossReferenceNumber varchar(20)
);
INSERT INTO Item VALUES ('item1', 'b1', 'Large');
INSERT INTO Item VALUES ('item2', 'bxx1', 'Large');
INSERT INTO Item VALUES ('item3', 'bddf1', 'Small');
INSERT INTO Item VALUES ('item4', 'be3f1', 'Small');
INSERT INTO Item VALUES ('item5', 'b13vx1', 'Small');
INSERT INTO CrossReference VALUES('item1', 'crossRef1')
INSERT INTO CrossReference VALUES('item1', 'crossRef2')
INSERT INTO CrossReference VALUES('item1', 'crossRef3')
INSERT INTO CrossReference VALUES('item1', 'crossRef4')
INSERT INTO CrossReference VALUES('item2', 'crossRef1')
INSERT INTO CrossReference VALUES('item2', 'crossRef1')
INSERT INTO CrossReference VALUES('item3', 'crossRef1')
INSERT INTO CrossReference VALUES('item4', 'crossRef2')
INSERT INTO CrossReference VALUES('item5', 'crossRef5')
INSERT INTO CrossReference VALUES('item5', 'crossRef1')
INSERT INTO CrossReference VALUES('item5', 'crossRef2')
INSERT INTO CrossReference VALUES('item5', 'crossRef3')
/* End of test data setup */
/* Begin of actual query */
DECLARE @xRefs VARCHAR(2000),
@query VARCHAR(8000)
SELECT @xRefs = STUFF((SELECT DISTINCT '],[' + ltrim(CrossReferenceNumber)
FROM CrossReference
ORDER BY '],[' + ltrim(CrossReferenceNumber)
FOR XML PATH('')
), 1, 2, '') + ']'
SET @query =
'SELECT *
FROM Item i
INNER JOIN
(
SELECT *
FROM
(
SELECT Item, CrossReferenceNumber
FROM CrossReference
) t
PIVOT (MAX(CrossReferenceNumber) FOR CrossReferenceNumber IN (' + @xRefs + ')) as pvt
) xRefs
ON i.Item = xRefs.Item
ORDER BY i.Item'
EXECUTE (@query)
/* end */
你爲什麼要那麼做 - 這不是標準化的思維,而且很可能你應該在這裏重新思考這個目標。 –
哪個DBMS?如果是SQL Server,請查看PIVOT運算符上的文檔。另請參見此問題的類似示例:http://stackoverflow.com/questions/1343145/tsql-pivot-without-aggregate-function – Kilanash
@Kerrek,我只需要數據表看起來像這樣,我不是像這樣創建一個SQL表。 VB6應用程序將旋轉並僅顯示列名和與其相關的值。我沒有寫出我只需要維護的東西。它曾經是一個巨大的完全非規範化的表格,所以我只是發回了一些與之前相似的東西。我不是VB6開發人員,不喜歡弄亂代碼。 – Nick