как совместить левые соединения? - PullRequest
0 голосов
/ 14 апреля 2011

В запросе MS Access 2007 как объединить следующие 2 запроса?

SELECT Tests.Release, Testcases.TestCase, Tests.Result
FROM Tests LEFT JOIN Testcases ON Tests.TestCaseID=Testcases.ID;

SELECT Tests.Release, ResultEnums.Result
FROM Tests LEFT JOIN ResultEnums ON ResultEnums.ID=Tests.Result;

Спасибо

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

Access имеет эту потрясающую «особенность», которая требует, чтобы вы объединяли свои объединения в скобках:

Select Tests.Release, Testcases.TestCase, Tests.Result, ResultEnums.Result
From (Tests
    Left Join TestCases
        On TestCases.TestCaseID = Tests.TestCaseID)
    Left Join ResultEnums
        On ResultEnums.ID = Tests.Result

Этот тип запроса может привести к некоторым плохим результатам в зависимости от схемы.Если для данной строки Tests возвращается несколько строк TestCases и несколько строк ResultEnums, эти строки будут объединены друг с другом через кросс-произведение.Например, если данная строка Tests вернула пять TestCases строк и три ResultEnums строки, вы получите 15 строк для этой строки Tests.Однако если, скажем, ResultEnums является родительским для таблицы Tests (таким образом, для каждой строки Tests вы получите только одно значение ResultEnums), тогда это должно работать нормально.

1 голос
/ 14 апреля 2011

Я не могу сейчас проверить, но вам обязательно нужна скобка:

SELECT Tests.Release
     , Testcases.TestCase
     , Tests.Result
     , ResultEnums.Result
FROM ( Tests 
       LEFT JOIN Testcases
         ON Tests.TestCaseID=Testcases.ID
     ) 
     LEFT JOIN ResultEnums
       ON ResultEnums.ID=Tests.Result 
;

или

SELECT Tests.Release
     , Testcases.TestCase
     , Tests.Result
     , ResultEnums.Result
FROM ( Tests 
       LEFT JOIN ResultEnums
         ON ResultEnums.ID=Tests.Result
     )
     LEFT JOIN Testcases
       ON Tests.TestCaseID=Testcases.ID
; 
0 голосов
/ 14 апреля 2011

Очень наивным / упрощенным решением было бы просто UNION ALL их:

SELECT Tests.Release, Testcases.TestCase, Tests.Result
FROM Tests LEFT JOIN Testcases ON Tests.TestCaseID=Testcases.ID;

UNION ALL
SELECT Tests.Release, NULL, ResultEnums.Result
FROM Tests LEFT JOIN ResultEnums ON ResultEnums.ID=Tests.Result;

edit: update для комментарий здесь

Я думаю, что это то, что вам нужно: Result из таблицы ResultEnums, Release из таблицы Tests и связанный TestCase из таблицы Testcases, все JOIN отредактированы наих ключи:

SELECT
    re.Result
    ,t.Release
    ,tc.TestCase
FROM
    Tests t
    LEFT JOIN TestCases tc ON t.TestCaseID = tc.ID
    LEFT JOIN ResultEnums re ON re.ID = t.Result
0 голосов
/ 14 апреля 2011
SELECT Tests.Release, Testcases.TestCase, Tests.Result, ResultEnums.Result
FROM Tests LEFT JOIN Testcases ON Tests.TestCaseID=Testcases.ID
LEFT JOIN ResultEnums ON ResultEnums.ID=Tests.Result;

РЕДАКТИРОВАТЬ Я не тестировал на Access, но в SQL Server вы могли бы сделать что-то похожее на это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...