отношения один ко многим - один предмет с множеством комментариев - PullRequest
1 голос
/ 21 декабря 2011

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

Вот с чего я начал:

select 
b.bg_id,
b.bg_reported_date as "Date Created",
b.bg_short_desc as "Summary",
bp.bp_comment_search as "Comment Body", 
s.st_name as "Status",
p.pr_name as "Priority",
bp.bp_type as "Update Type"
from 
bugs b
inner join bug_posts bp on b.bg_id = bp.bp_bug
inner join statuses s on b.bg_status = s.st_id
inner join priorities p on b.bg_priority = p.pr_id
--where bp.bp_type = 'comment'
order by b.bg_id asc

Это дало мне по одной строке для каждого комментария, а это не то, что я хочу.как вы можете видеть, я также пытался ограничить результаты включением только постов типа «комментарий», но это исключило все ошибки, у которых не было комментариев, поэтому я их убрал.

Я нашел эту статью, котораяказалось связанным: ПРИСОЕДИНЯЙТЕСЬ к SQL с отношением один ко многим

Но я не могу заставить его работать с моим запросом.вот что у меня есть на данный момент:

select 
b.bg_id,
b.bg_reported_date as "Date Created",
b.bg_short_desc as "Summary",
--bp.bp_comment_search as "Comment Body", 
s.st_name as "Status",
p.pr_name as "Priority",
--bp.bp_type as "Update Type"
from
bugs b
left outer join
    (select bp_comment_search as "Comment Body"
    from bug_posts
    group by bp_bug) bp on bp.bp_bug = b.bg_id
--inner join bug_posts bp on b.bg_id = bp.bp_bug

inner join statuses s on b.bg_status = s.st_id
inner join priorities p on b.bg_priority = p.pr_id
--where bp.bp_type = 'comment'
order by b.bg_id asc

Мои знания SQL ОЧЕНЬ ограничены, но любая помощь, которую кто-либо может предоставить, была бы очень признательна.Спасибо!

Ответы [ 2 ]

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

Для каждой ошибки может не быть ни одного комментария, ни одного комментария или много.Я хочу, чтобы ВСЕ ошибки возвращались, и все комментарии возвращались (хотя я хотел бы пропустить обновления), но в виде столбцов, а не одной строки на ошибку / комментарий.

Этого нельзя сделать дляпроизвольное количество комментариев.Для этого потребуется, чтобы ваш запрос возвращал переменное число столбцов в зависимости от данных, но в SQL количество столбцов в наборе результатов полностью определяется запросом и определениями таблиц.

Вывам нужно будет извлечь по одной строке для каждого комментария (либо из запроса, аналогичного вашему, либо из запроса, который просто извлекает данные комментария), и вручную добавить каждую строку данных комментария к объекту, представляющему его ошибку.(Кстати, большинство объектно-реляционных картографов обрабатывают отношения один ко многим.)

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

Вы должны оставить этот фильтр на «только комментарии», но замените «INNER JOIN» на «LEFT JOIN», тогда вы увидите погоду всех ошибок или нет комментариев.

Другая функциявы ищете, называется 'сводной', он пересекает строки (комментариев) в столбцы.

Я сам не знаю SQL Server 2008, но нашел эту ссылку для сводной таблицы: непосредственно в Microsoft .

Итак, кроме действия «комментарии к столбцам», это может быть ваш запрос:

select 
b.bg_id,
b.bg_reported_date as "Date Created",
b.bg_short_desc as "Summary",
bp.bp_comment_search as "Comment Body", 
s.st_name as "Status",
p.pr_name as "Priority",
from
bugs b
left join bug_posts bp on b.bg_id = bp.bp_bug AND bp.bp_type = 'comment'
inner join statuses s on b.bg_status = s.st_id
inner join priorities p on b.bg_priority = p.pr_id
order by b.bg_id asc
...