programing

SQL 데이터베이스에서 데이터를 끌어오려고 할 때 dplyr가 잘못된 테이블 이름을 ON 절에 사용하지 않도록 하는 방법은 무엇입니까?

instargram 2023. 10. 29. 19:00
반응형

SQL 데이터베이스에서 데이터를 끌어오려고 할 때 dplyr가 잘못된 테이블 이름을 ON 절에 사용하지 않도록 하는 방법은 무엇입니까?

나는 MariaDB 데이터베이스에 쿼리를 구성하는 몇가지 사용 사례가 있습니다.dplyr그리고 최종 결과를 수집으로 끌어내립니다.

최근에는 모두 작동을 멈추고 오류 메시지가 나타납니다.

오류 인collect(): ! 게으른 테이블을 수집하지 못했습니다.오류 발생: ! 'on clause' [1054]의 알 수 없는 열 'curriculum_standard.global_curriculum_standard_id'입니다.

기술적으로는 정확합니다. 데이터베이스에 해당 테이블에 해당 이름을 가진 열이 없습니다. 그러나 이유를 알 수 없습니다.dplyr처음부터 있다고 생각하는 쿼리를 생성하고 있습니다.

제가 만들고 있는 쿼리는 여러 테이블의 순차적인 결합을 필요로 하며, 이를 번역하기 위해 후드 아래에서 무엇을 하고 있는 것처럼 보입니다.by = 각각의 부분inner join()세번째 가입 후에 통화가 혼란스러워지고 있습니다.

여기 있습니다.dplyr코드는 다음과 같습니다.

##Imports
library(tidyverse)
library(DBI)
library(RMariaDB)

##Connecting to my DB
dashCon <- dbConnect(RMariaDB::MariaDB(),
                     default.file = path.expand("~/.my.cnf"),
                     group = "dashBI")


## dplyr query construction
## i know all these names are confusingly similar, but thats above my pay grade
q_curriculumCoverageTree = tbl(dashCon, "curriculum") %>% select(id, code, grade, deleted) %>%
  inner_join(
    tbl(dashCon, "curriculum_strand") %>% 
      select(id, curriculum), by = c("id" = "curriculum"), suffix = c("_curriculum", "_strand")
    ) %>%
  inner_join(
    tbl(dashCon, "curriculum_standard") %>%
      select(id, strand, code, description), by = c("id_strand" = "strand"), suffix = c("_curriculum", "_standard")
  ) %>%
  rename(id_standard = id) %>%
  left_join(
    tbl(dashCon, "curriculum_standard_global_curriculum_standard") %>%
      select(curriculum_standard_id, global_curriculum_standard_id), by = c("id_standard" = "curriculum_standard_id")
  ) %>%
  rename(gcs_id = global_curriculum_standard_id) %>%
  left_join(
    tbl(dashCon, "activity_curriculum_global_standards") %>%
      select(global_standard_id, activity_id), by = c("gcs_id" = "global_standard_id")
  ) 

그리고 이게 뭐냐구요.dplyr::show_query()내뱉는 말:

SELECT
  `curriculum`.`id` AS `id_curriculum`,
  `curriculum`.`code` AS `code_curriculum`,
  `grade`,
  `deleted`,
  `curriculum_strand`.`id` AS `id_strand`,
  `curriculum_standard`.`id` AS `id_standard`,
  `curriculum_standard`.`code` AS `code_standard`,
  `description`,
  `global_curriculum_standard_id` AS `gcs_id`,
  `activity_id`
FROM `curriculum`
INNER JOIN `curriculum_strand`
  ON (`curriculum`.`id` = `curriculum_strand`.`curriculum`)
INNER JOIN `curriculum_standard`
  ON (`curriculum_strand`.`id` = `curriculum_standard`.`strand`)
LEFT JOIN `curriculum_standard_global_curriculum_standard`
  ON (`curriculum_standard`.`id` = `curriculum_standard_global_curriculum_standard`.`curriculum_standard_id`)
LEFT JOIN `activity_curriculum_global_standards`
  ON (`curriculum_standard`.`global_curriculum_standard_id` = `activity_curriculum_global_standards`.`global_standard_id`)

마지막 ON 조항에서 어떤 이유로 다음을 가정하고 있음을 알 수 있습니다.global_curriculum_standard_id컬럼은 에 속합니다.curriculum_standard대신에 2개의 조인 전의 테이블.curriculum_standard_global_curriculum_standard이전 가입자들로부터

어쩌면 우리가 다른 사람들을inner_join()그리고.left_join()문제를 해결하지 못했을 수도 있지만 모든 내부 조인으로 전환해도 문제가 해결되지 않았습니다.

또한 이 기계는 최근에 업데이트되었고 이러한 쿼리는 이전에 모두 작동했기 때문에 패키지/R 업데이트와 관련이 있을 수 있다고 생각합니다.

지금 업데이트되어 이전에 어떤 버전을 사용하고 있었는지는 확실하지 않지만 현재 버전 정보:

RStudio = RStudio 2022.12.0+353 "Elsbeth Geranium" 
R = 4.2.2 (2022-10-31 ucrt) -- "Innocent and Trusting"
tidyverse = 2.0.0 (dplyr1.1.0)
DBI = 1.1.3
RMariaDB = 1.2.2

제가 무엇을 하고 있는지 전혀 몰랐기 때문에 처음부터 완전히 잘못 지었기 때문에 이 접근 방식을 어떻게 작동시킬 것인지 또는 완전히 개편할 것인지에 대한 제안을 받아들일 수 있습니다.

단지 폐쇄를 위한 업데이트일 뿐, 이 문제는 dplyr가 지원하도록 dplyr가 업데이트되지 않은 그들의 가입 함수에 새로운 기능을 추가함으로써 발생한 것으로 보입니다.

두 패키지가 모두 업데이트 되었으므로(dplyr = 1.1.0, dbplyr = 2.3.1), 제 쿼리는 예상대로 작동하고 있습니다.

언급URL : https://stackoverflow.com/questions/75535641/how-to-stop-dplyr-from-using-wrong-table-name-in-on-clause-when-trying-to-pull-d

반응형