Я имею следующий запрос 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)
Вам необходимо использовать подзапрос, чтобы применить условие:
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. Это не так уж и важно.
Получаете ли вы сообщение об ошибке, когда он выходит из строя или просто блокируется? Судя по имени dbo_B, я догадаюсь, что это связанные таблицы в Access. Я думаю, что когда вы делаете соединение, как это делает Access, он не говорит SQL-серверу, что ему нужен результат соединения, он говорит: "Дайте мне все строки обеих таблиц", а затем он пытается присоединиться к ним сам. Если таблицы очень большие, это может привести к блокировке приложения.
Вероятно, лучше создать представление на SQL-сервере для того, что вам нужно.
Последнее условие технически не является соединением, а сравнением с буквальным значением. Поместите его в выражение WHERE:
SELECT *
FROM a LEFT OUTER JOIN b ON a.ID = b.a_id
WHERE b.f_id = 3;