2016-03-19 15 views
5

Я изо всех сил пытаюсь найти примеры функции PL/R, которая может принимать две таблицы postgres. PL/R docs не дает такого примера.
Чтобы иметь рабочие примеры, рассмотрим возможность использования слияния двух таблиц postgres на стороне R.Функция PL/R, принимающая две таблицы в качестве аргументов

Имея две таблицы в Postgres

CREATE TABLE x (a numeric, b text); 
CREATE TABLE y (a numeric, d text); 
INSERT INTO x VALUES (1, 'a'),(2, 'b'); 
INSERT INTO y VALUES (2, 'b'),(3, 'c'); 

Я ищу заменить следующий запрос

SELECT * FROM x INNER JOIN y ON x.a=y.a; 

С помощью функции PL/R, определенной в R, как:

my_function = function(x, y){ 
    merge(x, y, by = "a") 
} 

Я смог вызвать функцию PL/R, которая принимает одну таблицу, но не две.

+1

Это невозможно в (postgres) SQL, вам просто нужен динамический SQL: сгенерируйте SQL-запрос, который использует имена таблиц и столбцов, и выполните этот запрос, возвращая результирующие строки.(форма 'by =" a '' форма передачи параметров, вероятно, должна быть немного изменена) – wildplasser

ответ

2

Я не думаю, что postgeql может принимать реальную таблицу в качестве параметров.

Но есть и другой способ сделать это. Вы можете передавать имена таблиц в качестве параметров.
Вот функция

CREATE OR REPLACE FUNCTION merge(t1 text, t2 text) 
returns setof x as 
    BEGIN 
    execute 'select * from ' || t1 ||' join ' || t2 || ' on t1.a=t2.a'; 
    END 

Выше функция для PostgreSQL, он может также записать в функции R.
Вот код для R

  1. Мы должны хранить все значения таблицы х в переменную х. Смотрите коды ниже

    x <- dbGetQuery(con, "SELECT * from sandbox.x") --con является соединением, которое подключение к БД, песочница имя схемы, х имя таблицы

  2. значения Магазина столовых у в переменном у

    y<-dbGetQuery(con, "SELECT * from sandbox.y")

  3. объединить 2 таблицы

    total <- merge(x,y,by="a")

  4. Вы также можете написать другую функцию обертку функции слияния, увидеть коды ниже

    myTotal <- function(x,y) { result <- merge(x,y,by="a") return(result) }

Я приложил скриншот шагов для справки

enter image description here

+0

huh, это нужно выполнить на стороне R – jangorecki

+0

Там есть функция, которую вы объединяете две таблицы в R-кодах. Во-первых, вам нужно создать 2 кадра данных (наборы данных), кадры данных должны соответствовать определению ваших таблиц. Затем вы можете использовать слияние функций сборки, см. Коды ниже полного <- merge (data frameA, data frameB, by = "a"). Это то, что вы хотите? – Robin

+0

Я обновил свой ответ, вы можете взглянуть на него. дайте мне знать, если у вас есть какие-либо вопросы. – Robin