СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ по дополнительным критериям в MS Access - PullRequest
8 голосов
/ 06 января 2010

У меня следующий запрос T-SQL (простой тестовый пример) работает нормально в MS SQL, но не могу получить эквивалентный запрос в MS Access (JET-SQL) Проблема заключается в дополнительных критериях в левом соединении. Как я могу сделать это в MS Access?

T-SQL:

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

JET-SQL (что у меня пока что, но вылетает Access!):

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

Ответы [ 3 ]

12 голосов
/ 07 января 2010

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

  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. Это не так уж важно.

1 голос
/ 07 января 2010

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

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

0 голосов
/ 06 января 2010

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

SELECT *
FROM a LEFT OUTER JOIN b ON a.ID = b.a_id
WHERE b.f_id = 3;
...