2016-05-24 11 views
2

ich die eine Tabelle einfügen: nach dem Tag folgt jeden einzelnen Wert in einer neuen Tabelle, in dieserWie verschiedene Werte aus derselben Zeile in mehreren Zeilen einer neuen Tabelle

id bigint, 
a integer, 
b integer, 
c integer, 
date date 

und ich habe zu setzen wenn in meinem ein Tisch hatte ich eine Reihe wie folgt

B table: 
id bigint, 
type integer, 
date date 

zum Beispiel: Weg

id a b c date 
13 5 4 7 2014-11-09 

ich möchte diese Werte in B setzen Tabelle wie folgt:

id type date 
1 5 2014-11-09, 
2 4 2014-11-09, 
3 7 2014-11-09 

Irgendwelche Vorschläge?

Antwort

1

Unpivot zuerst die Daten UNION ALL mit und weisen Sie dann ein neues idROW_NUMBER mit:

SELECT 
    ROW_NUMBER() OVER(ORDER BY id, col) AS id, 
    type, 
    date 
FROM (
    SELECT id, 'a' AS col, a AS type, date FROM tableA UNION ALL 
    SELECT id, 'b' AS col, b AS type, date FROM tableA UNION ALL 
    SELECT id, 'c' AS col, c AS type, date FROM tableA 
) t 

Wenn der neue id wird automatisch generiert, Sie brauchen nicht auf die ROW_NUMBER überhaupt.

SELECT a AS type, date FROM tableA UNION ALL 
SELECT b AS type, date FROM tableA UNION ALL 
SELECT c AS type, date FROM tableA 
0
INSERT INTO A 
    (id , 
     a , 
     b , 
     c , 
     date) 
VALUES (13, 
     5 , 
     4 , 
     7 , 
     2014-11-09 
    ) 



ALTER TRIGGER NewTrigger ON A 
AFTER INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 


    DECLARE @id AS NVARCHAR(50) 
    DECLARE @type AS NVARCHAR(50) 
    DECLARE @date AS INT 



    SELECT @Date = INSERTED.Date 
    FROM INSERTED 


    INSERT INTO B 
      (Date, 
       Type, 
       id 
      ) 
    VALUES (@Date, 
       4, 
       1 
      ) 

END 
GO 

SELECT * A 
SELECT * FROM B 
0

In Oracle können Sie versuchen, REGEXP mit der sqame zu simulieren. Hoffe das hilft.

SELECT DISTINCT LEVEL, 
    TRIM(regexp_substr(a.colk,'[^,]+', 1, level)) TYPE, 
    SYSDATE 
FROM 
    (SELECT LEVEL, 
    COL1 
    ||',' 
    ||COL2 
    ||',' 
    ||COL3 colk, 
    SYSDATE 
    FROM 
    (SELECT 13 AS ID,5 COL1,4 AS COL2,7 AS COL3,sysdate AS dt FROM DUAL 
    ) 
    CONNECT BY LEVEL <= REGEXP_COUNT(COL1 
    ||',' 
    ||COL2 
    ||',' 
    ||COL3,',')+1 
)a 
    CONNECT BY regexp_substr(a.colk, '[^,]+', 1, level) IS NOT NULL; 
0

Wettbewerb für kürzesten Code :) Meine Variante ist:

insert into b(type, date) 
select unnest(array[a,b,c]), date from a; 

Unter der Annahme, dass die id Spalt in der Tabelle b autoinkrementierten werden.

Verwandte Themen