سؤال

ولدي جدول البيانات، وأسمح الناس لإضافة بيانات التعريف لهذا الجدول.

وأعطي لهم واجهة التي تتيح لهم التعامل معها كما لو أنها تقوم بإضافة أعمدة إضافية إلى طاولة يتم تخزين البيانات الخاصة بهم في، ولكن أنا فعلا تخزين البيانات في جدول آخر.

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 لأداء المحور.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top