возвращение строк из неявного JOIN, где результаты либо существуют в обеих таблицах, либо только в одной таблице - PullRequest
0 голосов
/ 02 декабря 2011

У меня есть база данных PostgreSQL-9.0.x, которая управляет средой автоматического тестирования.Существует множество таблиц, которые содержат различные статические данные (версии ОС, имена тестов и т. Д.) С именами «buildlist» и «osversmap».Однако есть также две таблицы, которые содержат данные, которые часто меняются.Первая - это «ожидающая» таблица, которая фактически представляет собой очередь тестов, где ожидающие тесты выбираются тестовыми системами самостоятельно, а затем удаляются после завершения тестового прогона.Вторая - это таблица «Результаты», которая содержит результаты испытаний по мере их производства (в процессе и завершено).

Записи в ожидающей таблице имеют отношение один ко многим с записями в таблице результатов (каждая ожидающая строка может содержать 0 или более строк в результатах).Например, если ни в одной из тестовых систем не было самостоятельного назначения ожидающей строки, в результатах будет нулевое число связанных строк, а затем после назначения ожидающей строки число строк в результатах будет увеличиваться для каждой ожидающей строки.Еще одна особенность заключается в том, что мне всегда нужна только самая новая строка таблицы результатов, связанная с каждой ожидающей строкой таблицы.Что мне нужно сделать, это запросить «ожидающую» таблицу для ожидающих тестов, а затем также получить «logurl» из таблицы результатов, которая соответствует каждой строке ожидающей таблицы.

Все это довольно похоже на этопроблема, за исключением того, что у меня есть дополнительное бремя двух дополнительных таблиц со статическими данными (buildlist & osversmap): PHP / SQL: используя только один запрос, ВЫБРАТЬ строки из двух таблиц, если данные находятся в обеих таблицах, или простоВЫБЕРИТЕ из одной таблицы, если нет

Я спотыкаюсь о том, как интегрировать эти две таблицы со статическими данными в запрос.Следующий запрос работает нормально, если в таблице «результатов» есть хотя бы одна строка, соответствующая каждой строке в таблице ожидания (однако он ничего не возвращает для строк, которые существуют только в «ожидании», но еще не в'результаты'):

SELECT 
 pending.cl,
 pending.id,
 pending.buildid,
 pending.build_type,
 pending.active,
 pending.submittracker,
 pending.os,pending.arch,
 pending.osversion,
 pending.branch,
 pending.comment,
 osversmap.osname,
 buildlist.buildname,
 results.logurl 
FROM pending ,osversmap ,buildlist ,results 
WHERE 
 pending.buildid=buildlist.id 
 AND pending.os=osversmap.os 
 AND pending.osversion=osversmap.osversion 
 AND pending.owner='$owner' 
 AND pending.completed='f' 
 AND results.hostname=pending.active 
 AND results.submittracker=pending.submittracker 
 AND pending.cl=results.cl 
 AND results.current_status!='PASSED' 
 AND results.current_status NOT LIKE '%FAILED' 
ORDER BY pending.submittracker,pending.branch,pending.os,pending.arch

спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 02 декабря 2011

Все это довольно похоже на эту проблему, за исключением того, что у меня есть дополнительное бремя двух дополнительных таблиц со статическими данными (buildlist & osversmap):

Самый простой подходбыть для построения представления, которое возвращает правильные строки без ссылки на buildlist и osversmap.Затем присоедините эти две таблицы к представлению.

CREATE VIEW your-meaningful-view-name AS
SELECT 
 pending.cl,
 pending.id,
 pending.buildid,
 pending.build_type,
 pending.active,
 pending.submittracker,
 pending.os,pending.arch,
 pending.osversion,
 pending.branch,
 pending.comment,
 results.logurl 
FROM pending
-- No DDL or sample INSERT statements. You might need an outer join.
INNER JOIN results 
        ON (results.hostname=pending.active AND
            results.submittracker=pending.submittracker AND
            results.cl=pending.cl)
WHERE pending.owner='$owner' AND
      pending.completed='f' AND
      -- Are *both* these really necessary?
      results.current_status!='PASSED' AND
      results.current_status NOT LIKE '%FAILED' 

А затем

SELECT  osversmap.osname, buildlist.buildname, ymvn.*,
FROM your-meaningful-view-name ymvn
INNER JOIN osversmap ON ymvn.os=osversmap.os  
                    AND ymvn.osversion=osversmap.osversion 
INNER JOIN buildlist ON ymvn.buildid=buildlist.id 
ORDER BY ymvn.submittracker, ymvn.branch, ymvn.os, ymvn.arch
0 голосов
/ 02 декабря 2011

У вас работает следующее?

SELECT  pending.cl,
        pending.id,
        pending.buildid,
        pending.build_type,
        pending.active,
        pending.submittracker,
        pending.os,
        pending.arch,
        pending.osversion,
        pending.branch,
        pending.comment,
        osversmap.osname,
        buildlist.buildname,
        results.logurl
FROM pending
    JOIN osversmap
        ON ( pending.os = osversmap.os
            AND pending.osversion = osversmap.osversion )
    JOIN buildlist
        ON ( pending.buildid = buildlist.id )
    LEFT OUTER JOIN results
        ON ( pending.active = results.hostname
            AND pending.submittracker = results.submittracker
            AND pending.cl = results.cl 
            AND results.current_status != 'PASSED'
            AND results.current_status NOT LIKE '%FAILED'
            )
WHERE pending.owner = '$owner'
    AND pending.completed = 'f'
ORDER BY pending.submittracker,
    pending.branch,
    pending.os,
    pending.arch
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...