ОСТАВЛЕННОЕ ПРИСОЕДИНЕНИЕ на дополнительных критериях в Доступе MS

Я имею следующий запрос T-SQL (простой тестовый сценарий) хорошо работающий в MS SQL, но не могу получить эквивалентный запрос в Доступе MS (струйный SQL). Проблемой являются дополнительные критерии в ЛЕВОМ СОЕДИНЕНИИ. Как я могу сделать это в Доступе MS?

T-SQL:

SELECT * FROM A 
LEFT OUTER JOIN B ON A.ID = B.A_ID 
                 AND B.F_ID = 3

Струйный SQL (что я имею до сих пор, но разрушаю Доступ!):

SELECT * FROM dbo_A 
LEFT JOIN dbo_B ON (dbo_A.ID = dbo_B.A_ID AND dbo_B.F_ID = 3)
8
задан OMG Ponies 6 January 2010 в 20:15
поделиться

3 ответа

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

  SELECT *
  FROM dbo_A LEFT JOIN 
    [SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3]. AS dbo_B 
      ON dbo_A.ID = dbo_B.A_ID;

Если вы используете Access с включенным режимом совместимости «SQL 92», вы можете сделать более стандартные:

  SELECT *
  FROM dbo_A LEFT JOIN 
    (SELECT dbo_B.* FROM dbo_B WHERE dbo_B.F_ID = 3) AS dbo_B 
      ON dbo_A.ID = dbo_B.A_ID;

Вам нужно, чтобы это можно было редактировать в Access? Если нет, просто используйте сквозной запрос с собственным T-SQL. Если это так, я бы, вероятно, создал для этого представление на стороне сервера, и я бы особенно хотел переместить его на стороне сервера, если буквальное значение - это то, что вы бы параметризовали (т.е. F_ID = 3 действительно F_ID = N, где N - значение, выбранное во время выполнения).

Кстати, я пишу эти операторы SQL для производных таблиц с подзапросом выбора каждый день, работая в Access. Это не так уж и важно.

12
ответ дан 5 December 2019 в 19:00
поделиться

Получаете ли вы сообщение об ошибке, когда он выходит из строя или просто блокируется? Судя по имени dbo_B, я догадаюсь, что это связанные таблицы в Access. Я думаю, что когда вы делаете соединение, как это делает Access, он не говорит SQL-серверу, что ему нужен результат соединения, он говорит: "Дайте мне все строки обеих таблиц", а затем он пытается присоединиться к ним сам. Если таблицы очень большие, это может привести к блокировке приложения.

Вероятно, лучше создать представление на SQL-сервере для того, что вам нужно.

1
ответ дан 5 December 2019 в 19:00
поделиться

Последнее условие технически не является соединением, а сравнением с буквальным значением. Поместите его в выражение WHERE:

SELECT *
FROM a LEFT OUTER JOIN b ON a.ID = b.a_id
WHERE b.f_id = 3;
-4
ответ дан 5 December 2019 в 19:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: