0

ここにテーブルSQLがあります

| id | dataid |  datarow | datacolumn | datavalue
_________________________________________________
|  1  |  1     |     1    | FirstName   |  John
|  1  |  1     |     1    | LastName    |  Lobo
|  1  |  1     |     1    | Age         |  35
|  1  |  1     |     2    | FirstName   |  Mich
|  1  |  1     |     2    | LastName    |  Handness
|  1  |  1     |     2    | Age         |  22
|  1  |  1     |     3    | FirstName   |  Mike
|  1  |  1     |     3    | LastName    |  Longbow
|  1  |  1     |     3    | Age         |  55

このようなものを出力します

FirstName  LastName Age
   John      Lobo   35
   Mich      Handness 22
   Mike      Longbow  55
SELECT DISTINCT     
        t1.datavalue AS Firstname, 
        t2.datavalue AS Lastname,
        t3.datavalue AS Age

FROM largedatatable t1 
        LEFT JOIN (SELECT datavalue,datarow FROM largedatatable WHERE           datacolumn='LastName') t2 ON t1.datarow = t2.datarow
        LEFT JOIN (SELECT datavalue,datarow FROM largedatatable WHERE datacolumn='Age') t3 ON t1.datarow = t3.datarow

WHERE t1.dataid = 1 

次のような結果が得られます

Firstname  LastName   Age
John        Lobo      35
Mich      Handness    22
Mike      Longbow     55

これで、スクリプトは問題なく動作します。ただし、データセットが大きい場合、クエリは遅くなります。とにかく、この SQL クエリを最適化することはできますか? ありがとう!

4

2 に答える 2

1

これで問題が解決すると思います。または、少なくとも、テーブルを一度だけフェッチするため、実行が速くなります。

select 
    max(case datacolumn when 'FirstName' then datavalue else '' end) as FirstName,
    max(case datacolumn when 'LastName' then datavalue else '' end) as LastName,
    max(case datacolumn when 'Age' then datavalue else '' end) as Age
from 
    large
group by datarow

ここでフィドルを参照してください:http://sqlfiddle.com/#!2/f4045/11

于 2013-11-13T14:07:47.573 に答える
0

結合を支援するために ( datarow, datacolumn ) にインデックスがあることを確認しますが、結合は次のように単純化できます

SELECT 
        t1.datavalue AS Firstname, 
        t2.datavalue AS Lastname,
        t3.datavalue AS Age
   FROM 
      largedatatable t1
         LEFT JOIN largedatatable t2
            on t1.datarow = t2.datarow
           and t2.datacolumn = 'LastName'
         LEFT JOIN largedatatable t3
            on t1.datarow = t3.datarow
           and t3.datacolumn = 'Age'
   WHERE
      t1.datacolumn = 'FirstName'

これは、最初の名前の列のみに基づいてプライマリ テーブルを 1 回だけ通過しますが、集計の MAX() または GROUP BY を必要とせずに 2 番目のインスタンスから列をプルします。

于 2013-11-13T13:42:30.660 に答える