R передача результатов SQL в оператор SQL - PullRequest
1 голос
/ 14 октября 2019

Я извлекаю некоторые результаты из базы данных MySQL, как показано ниже:

GetJobCodes=paste0("select EMPLID from jobCurrent where JOBCODE='",JOBCODE,"'")
JOBCODES = dbGetQuery(connection,GetJobCodes) 

, и я хочу передать результаты JOBCODES выше другого оператора SQL

statement=sprintf("SELECT A.EMPLID, A.CLASS_ID FROM lmsEnroll A JOIN lmsCourses\ 
              B ON A.COURSE_ID=B.COURSE_ID AND B.REQUIRED=0 WHERE A.EMPLID IN (%s)",JOBCODES)

Но когда я передаю вПриведенное выше утверждение печатается как

SELECT A.EMPLID, A.CLASS_ID FROM lmsEnroll A JOIN lmsCourses\ 
       B ON A.COURSE_ID=B.COURSE_ID AND B.REQUIRED=0 WHERE A.EMPLID IN "C("00330022","00033322")")

, что не правильно, я хочу напечатать их следующим образом:

SELECT A.EMPLID, A.CLASS_ID FROM lmsEnroll A JOIN lmsCourses\ 
       B ON A.COURSE_ID=B.COURSE_ID AND B.REQUIRED=0 WHERE A.EMPLID IN ("00330022","00033322")

Я использовал функцию ShQuote, но это не помогает. Я ценю, если кто-нибудь может мне помочь.

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Рассмотрим один запрос с параметризацией (избегая обработки кавычек или конкатенации), поскольку вы можете использовать оператор SELECT внутри предложения IN:

sql <- "SELECT A.EMPLID, A.CLASS_ID 
        FROM lmsEnroll A 
        JOIN lmsCourses B ON A.COURSE_ID=B.COURSE_ID AND B.REQUIRED=0 
        WHERE A.EMPLID IN
           (SELECT EMPLID FROM jobCurrent WHERE JOBCODE = ?)"

emp_df <- dbGetQuery(connection, sql, list(JOBCODE)) 

В качестве альтернативы, с JOIN:

sql <- "SELECT A.EMPLID, A.CLASS_ID 
        FROM lmsEnroll A 
        INNER JOIN lmsCourses B 
              ON A.COURSE_ID = B.COURSE_ID AND B.REQUIRED = 0 
        INNER JOIN 
             (SELECT DISTINCT EMPLID FROM jobCurrent WHERE JOBCODE = ?) sub
              ON A.EMPLID IN sub.EMPLID"

emp_df <- dbGetQuery(connection, sql, list(JOBCODE))
0 голосов
/ 15 октября 2019

Понял! Этот вопрос все о рендеринге. При выборе команды EMPLID с JOBCODES проблема с данными была решена.

JOBCODES =paste(shQuote(JOBCODES$EMPLID,type="sh"),collapse=",") //Selecting EMPLID column

statement=paste0("SELECT A.EMPLID, A.CLASS_ID FROM lmsEnroll A JOIN lmsCourses B ON A.COURSE_ID=B.COURSE_ID AND B.REQUIRED=0 WHERE A.EMPLID IN 
(",JOBCODES,")")
0 голосов
/ 14 октября 2019

Вы можете использовать glue для этого.

library(glue)

GetJobCodes <- paste0("select EMPLID from jobCurrent where JOBCODE='",JOBCODE,"'")
JOBCODES <- dbGetQuery(connection,GetJobCodes)
statement <- "SELECT A.EMPLID, A.CLASS_ID FROM lmsEnroll A JOIN lmsCourses\ 
              B ON A.COURSE_ID=B.COURSE_ID AND B.REQUIRED=0 WHERE A.EMPLID IN ({JOBCODES})"
request <- glue_sql(statement,JOBCODES = JOBCODES, .con = connection)
...