Я написал запрос в SQL Server, и он запустился без проблем. Вот запрос с именами, измененными по соображениям конфиденциальности.
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
Это отлично работает и вытягивает 30 тыс. строк. Я создал ODBC-соединение с сервером в R, используя пакеты DBI
и odbc
. Я могу выполнять запросы из R просто отлично. Я запускал многие без проблем. Например, это выполняется без ошибок:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SELECT TOP 10 *
FROM table1 (nolock);
")
Но когда я включаю LEFT JOIN
, запрос в R не выполняется и возвращает ошибку.
Вот тот же запрос в R:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
")
Я работаю в VSCode, поэтому сообщение об ошибке не очень информативно:
Error in app$vspace(new_style$
margin-top
%||% 0) : attempt to apply non-function
Основываясь на некоторых других ответах, я включил в запрос пару дополнительных параметров, но они не помогли:
DBI::dbGetQuery(conn, believeNRows = FALSE, "
SET ANSI_WARNINGS OFF;
SET NOCOUNT ON;
SELECT *
FROM table1 (nolock)
LEFT JOIN table2 (nolock)
ON table1.ID = table2.ID
WHERE table1.Date = '2021-03-05' AND table1.ID = '120';
")
Кто-нибудь знает, почему этот совершенно хороший запрос не работает при передаче на SQL Server из R?
@Larnu Это было предложено мне ИТ, но я сейчас проверю ссылку. Однако включение nolock
не влияет на результат ошибки.
Нет, но это повлияет на надежность ваших результатов.
Возможно, conn
не указывает на базу данных, о которой вы думаете. Можете ли вы select top 10 * from table2
самостоятельно?
@AlwaysLearning Да, я могу получить данные от каждого отдельно. Только когда я использую JOIN
, я получаю сообщение об ошибке.
Возможно, было бы полезно увидеть более информативное сообщение об ошибке. Можете ли вы запустить то же соединение и код в Rterm
или RStudio? (Я не осознавал, что VScode замаскировал сообщения об ошибках, это определенно может расстраивать.)
@r2evans Благодаря вашему комментарию я решил проблему! Я запустил код в Rconsole, как вы предложили, и получил такое же замаскированное сообщение об ошибке. Это выглядело странно, поэтому я провел небольшое исследование и нашел исправление, перезапустил код и получил полезное сообщение об ошибке, которое решило проблему. Смотрите мой ответ ниже.
На случай, если у кого-то еще возникнет эта проблема в будущем, на моем пути было два препятствия. Во-первых, относительно комментария @r2evans мои сообщения об ошибках были замаскированы. Согласно проблема с читателем github, я переустановил пакет cli
и начал получать незамаскированные сообщения об ошибках. Перезапустил мой код и получил эту ошибку:
Error:
! Column names `ID1` and `Col1` must not be duplicated.
Use .name_repair to specify repair.
Caused by error in `stop_vctrs()`:
! Names must be unique.
x These names are duplicated:
* "ID1" at locations 3 and 72.
* "Col1" at locations 45 and 75.
Run `rlang::last_error()` to see where the error occurred.
Оказывается, вызов SQL
возвращает все столбцы, а SSMS автоматически удаляет повторяющиеся столбцы. R, с другой стороны, нет. Поэтому я изменил свое предложение SELECT
, чтобы выбрать нужные столбцы, и код заработал.
Почему вы используете
NOLOCK
на всех ваших столах? Вы понимаете, что делаетNOLOCK
? Почему бы просто не изменить уровень изоляции? Я предлагаю прочитать Вредные привычки : везде ставить NOLOCK