0

私はこのような2つのテーブルを持っています

表1

profile
--------
id
---
1 | XXX
2 | zzz

表 2

profile_details
-----------------
id |    K       |   V
---------------------------
1  | first_name | XXX
1  | last_name  | YYY
1  | gender     | female
2  | name       | zzzzz
2  | gender     | male
2  | phone      | 8999xxxx
2  | location   | india
2  | spoken_language | hindi

このクエリを使用して、行を列としてフェッチします

select profiles.id,
max( decode( k, 'first_name', v, NULL )) first_name,
max(decode(k, 'last_name', v, null))as last_name ,
max( decode( k, 'gender', v, NULL)) gender
from profile_details , profiles
where 
profile_details.id = profiles.id 
and
profile_details.id=1
group by profiles.id

私を連れてきた

id | first_name| last_name | gender
--------------------------------------------
1  |   XXX     |  YYY      | female

これは、行を列としてフェッチするために機能します。しかし、K 値は可能な限り何でもよいため、列を動的に含めるようにこのクエリを変更するにはどうすればよいでしょうか。

たとえば、id 2 の場合、次のようになります。

id | name | gender | mobile   |   location  | spoken_language
------------------------------------------------------------------
2  | zzz  | male   | 8999xxxx |   india     | hindi

ありがとうV

4

2 に答える 2

2

ここにあるのはEntity-Attribute-Valueスキーマであり、スキーマに柔軟性を提供するためによく使用されます。

欠点は、これから行うすべてのことは、これを含めて、言葉では言い表せないほど苦痛で困難になることです。これには、簡単な解決策はありません。

このテーマに関するレッスンは次のとおりです。https ://www.simple-talk.com/opinion/opinion-pieces/bad-carma/

于 2013-03-20T15:14:11.417 に答える
1

動的 SQL を使用して、実行する文字列を生成できます。

Oracle では、必要なid値を渡してsys_refcursor.

手順は次のようになります。

CREATE OR REPLACE procedure dynamic_pivot_profile(p_cursor in out sys_refcursor, p_id in number)
as
    sql_query varchar2(1000) := 'select p.id ';

    begin
        for x in (select distinct k from profile_details where id=p_id order by 1)
        loop
            sql_query := sql_query ||
                ' , max(case when pd.k = '''||x.k||''' then pd.v end) as "'||x.k||'"';

                dbms_output.put_line(sql_query);
        end loop;

        sql_query := sql_query || ' from profile p 
                                                inner join profile_details pd
                                                  on P.ID = pd.id
                                                where PD.ID = '||p_id||'
                                                group by p.id';
        dbms_output.put_line(sql_query);

        open p_cursor for sql_query;
    end;
/

次に、結果を返します。TOAD で以下を使用します。

variable x refcursor
exec dynamic_pivot_profile(:x, 1) -- pass in your id
print x

これにより、指定した目的の結果が返されます。

于 2013-03-20T15:29:24.873 に答える