ما استعلام SQL أو عرض سوف تظهر "الأعمدة الحيوية"
سؤال
ولدي جدول البيانات، وأسمح الناس لإضافة بيانات التعريف لهذا الجدول.
وأعطي لهم واجهة التي تتيح لهم التعامل معها كما لو أنها تقوم بإضافة أعمدة إضافية إلى طاولة يتم تخزين البيانات الخاصة بهم في، ولكن أنا فعلا تخزين البيانات في جدول آخر.
Data Table
DataID
Data
Meta Table
DataID
MetaName
MetaData
وحتى إذا أرادوا جدول تخزين البيانات، والتاريخ، واسم، ثم كنت قد البيانات في جدول البيانات، وكلمة "التاريخ" في metaname، والتاريخ في الفوقية، وآخر صف في جدول الفوقية مع "الاسم" في metaname واسم في الفوقية.
وأنا الآن بحاجة إلى الاستعلام الذي يأخذ المعلومات من هذه الجداول ويقدمها كما لو قادمة من جدول واحد مع اثنين من أعمدة إضافية "البيانات" و "اسم" حتى للعميل سيبدو هناك جدول واحد مع أعمدة عادتهم:
MyTable
Data
Date
Name
وأو، بعبارة أخرى، كيف أذهب من هنا:
Data Table
DataID Data
1 Testing!
2 Hello, World!
Meta Table
DataID MetaName MetaData
1 Date 20081020
1 Name adavis
2 Date 20081019
2 Name mdavis
لهنا:
MyTable
Data Date Name
Testing! 20081020 adavis
Hello, World! 20081019 mdavis
وقبل سنوات عندما فعلت ذلك في الخلية باستخدام PHP، فعلت اثنين من الاستفسارات، أول من يحصل على بيانات التعريف إضافية، والثاني للانضمام لهم جميعا معا. أنا على أمل أن قواعد البيانات الحديثة لديها وسائل بديلة للتعامل مع هذا.
وذات صلة إلى الخيار 3 من هذا السؤال .
و-Adam
المحلول
وترغب في محوري كل الصفوف زوج اسم القيمة الخاصة بك في MyTable ... جرب هذا SQL:
DECLARE @Data TABLE (
DataID INT IDENTITY(1,1) PRIMARY KEY,
Data VARCHAR(MAX)
)
DECLARE @Meta TABLE (
DataID INT ,
MetaName VARCHAR(MAX),
MetaData VARCHAR(MAX)
)
INSERT INTO @Data
SELECT 'Data'
INSERT INTO @Meta
SELECT 1, 'Date', CAST(GetDate() as VARCHAR(20))
UNION
SELECT 1, 'Name', 'Joe Test'
SELECT * FROM @Data
SELECT * FROM @Meta
SELECT
D.DataID,
D.Data,
MAX(CASE MetaName WHEN 'Date' THEN MetaData ELSE NULL END) as Date,
MAX(CASE MetaName WHEN 'Name' THEN MetaData ELSE NULL END) as Name
FROM
@Meta M
JOIN @Data D ON M.DataID = D.DataID
GROUP BY
D.DataID,
D.Data
نصائح أخرى
SELECT DataTable.Data AS Data, MetaTable.MetaData AS Date, MetaTable.MetaName AS Name
FROM DataTable, MetaTable
WHERE DataTable.DataID = MetaTable.DataID
وربما عليك تريد إضافة شرط إضافي (AND البيانات = 'بعض القيمة') للعودة الصفوف المستخدم مهتمة.
وAFAIK، يمكنك أن تفعل هذا على الجانب الخادم فقط مع إجراء مخزن SQL
ديناميكية.
وفعال الرمز الذي تريد توليد حيوي هو:
SELECT [Data Table].*
,[MyTable Date].MetaData
,[MyTable Name].MetaData
FROM [Data Table]
LEFT JOIN [MyTable] AS [MyTable Date]
ON [MyTable Date].DataID = [Data Table].DataID
AND [MyTable Date].MetaName = 'Date'
LEFT JOIN [MyTable] AS [MyTable Name]
ON [MyTable Name].DataID = [Data Table].DataID
AND [MyTable Name].MetaName = 'Name'
وهنا كود للقيام بذلك:
DECLARE @sql AS varchar(max)
DECLARE @select_list AS varchar(max)
DECLARE @join_list AS varchar(max)
DECLARE @CRLF AS varchar(2)
DECLARE @Tab AS varchar(1)
SET @CRLF = CHAR(13) + CHAR(10)
SET @Tab = CHAR(9)
SELECT @select_list = COALESCE(@select_list, '')
+ @Tab + ',[MyTable_' + PIVOT_CODE + '].[MetaData]' + @CRLF
,@join_list = COALESCE(@join_list, '')
+ 'LEFT JOIN [MyTable] AS [MyTable_' + PIVOT_CODE + ']' + @CRLF
+ @Tab + 'ON [MyTable_' + PIVOT_CODE + '].DataID = [DataTable].DataID' + @CRLF
+ @Tab + 'AND [MyTable_' + PIVOT_CODE + '].MetaName = ''' + PIVOT_CODE + '''' + @CRLF
FROM (
SELECT DISTINCT MetaName AS PIVOT_CODE
FROM [MyTable]
) AS PIVOT_CODES
SET @sql = 'SELECT [DataTable].*' + @CRLF
+ @select_list
+ 'FROM [DataTable]' + @CRLF
+ @join_list
PRINT @sql
--EXEC (@sql)
هل يمكن استخدام تقنية ديناميكية مماثلة باستخدام المثال بيان CASE
لأداء المحور.