2016-09-22 10 views
0

Ich habe diese drei Tabellen für Dienste, executed_services und eine Bewertungstabelle, die den Dienst bewertet. Meine Bewertungstabelle hat einen Fremdschlüssel für executed_services, und so wollte ich den Dienst, der bewertet werden soll, in die Beziehung executed_services "kopieren". Ich habe versucht, das folgende Verfahren zu verwenden, aber diese Auswahl funktioniert nicht, da nur ein Ergebnis zurückgegeben werden muss.Zeile von einer Tabelle in eine andere kopieren?

BEGIN 
     INSERT INTO servico_executado (id, data_abertura, id_solicitacao, id_profissional) 
      VALUES (SELECT id, data_abertura, id_solicitacao, id_profissional FROM servico WHERE id = NEW.id_servico); 
     DELETE FROM servico WHERE id = NEW.id_servico; 
     RETURN NEW; 
    END; 

Also, was soll ich tun, um die Werte aus einer Tabelle zu erhalten und auf einem anderen einfügen? Oder gibt es einen anderen Weg, das zu tun?

Antwort

0
INSERT INTO servico_executado 
     SELECT id, data_abertura, id_solicitacao, id_profissional 
     FROM servico WHERE id = NEW.id_servico; 

Keine "WERTE" verwenden. Wenn Sie mehr Spalten in der Tabelle haben, können Sie in der SELECT-Anweisung null für diese fehlenden Spalten verwenden.

+0

Danke, ich habe nicht einmal daran gedacht. Arbeitete wie ein Charme –

+0

Ich bin froh, dass Sie Zeit für das Schreiben von Feedback verwendet haben. Vielen Dank. Glauben Sie mir, Sie werden in den kommenden Jahren fast 100 Mal diese "einfügen in abc select .. from xyz" verwenden. –

1

Sie können es sehr leicht in einem Schritt mit einem CTE mit der folgenden einfachen Abfrage:

WITH deleted AS (DELETE FROM servico WHERE id = $1 RETURNING *) 
INSERT INTO servico_executado (id, data_abertura, id_solicitacao, id_profissional) 
SELECT id, data_abertura, id_solicitacao, id_profissional FROM deleted 
RETURNING *; 

Es gibt keine Notwendigkeit PL verwenden/pgSQL. Die id des verschobenen Dienstes wird in der obigen Abfrage durch den Platzhalter $1 angegeben.

+0

Danke für die Hilfe, aber ich bleibe bei der anderen Antwort, da es leichter scheint –

+0

das ist die richtige Antwort auch. Ich werde das abstimmen. –

Verwandte Themen