Alias Query a campi incrociati in Oracle.
Supponiamo di avere due tabelle:
Master Table |
Column |
Type |
Description |
ID |
INT |
Unique identity column |
name |
VARCHAR2(100) |
name of object of interest. |
Detail Table |
Column |
Type |
Description |
ID |
INT |
Unique identity column |
name |
VARCHAR2(100) |
name of property. |
val |
VARCHAR2(100) |
value of property. |
Una tradizionale query tra queste due tabelle
SELECT M.ID,
M.name,
D.name AS property,
D.val AS propValue
FROM Master M
JOIN Detail D
ON D.ID = M.ID
darebbe il seguente risultato
ID
name
property propValue
---- ------------
---------- -----------
1
Thing1
bit1 xxxx
1 Thing1
bit2 yyyy
2 Thing2
bit1 aaaa
3
Thing2 bit2 bbbb
Potrebbe capitare che sia più utile avere il seguente risultato
ID
name
bit1 bit2
----
------------ ---------- -----------
1 Thing1
xxxx yyyy
2 Thing2
aaaa bbbb
La cui relativa query sql è la seguente:
SELECT M.id, M.name,
(SELECT D.val FROM XDetail D
WHERE D.id = M.id AND D.name = 'xxxx') AS "xxxx",
(SELECT D.val FROM XDetail D
WHERE D.id = M.id AND D.name = 'yyyy') AS "yyyy"
FROM XMaster M
WHERE M.id = 1
Tuttavia potrebbe essere più utile implementare un meccanismo per la
generazione di tali query, eccone un esempio per la query precedente.
DECLARE
p_id number := 1;
sqls varchar(1000);
cols varchar(1000) := '';
CURSOR cur IS
SELECT D.id, D.name, D.val
FROM XDetail D
WHERE D.id = p_id;
BEGIN
FOR rec IN cur LOOP
IF (LENGTH(cols) > 0) THEN
cols := cols || ',';
END IF;
cols := cols
|| '(SELECT D.val FROM XDetail D »»
WHERE D.id = M.id AND D.name = '''
|| rec.name
|| ''') AS "'
|| rec.name
|| '"';
END LOOP;
sqls := 'SELECT M.id, M.name, '
|| cols
|| ' FROM XMaster M WHERE M.id = '
|| p_id;
EXECUTE IMMEDIATE sqls;
END;
Fonte: http://weblogs.asp.net/stevencohn/archive/2005/01/28/362373.aspx
Fletto i muscoli e sono nel vuoto.
powered by IMHO