Многие к одному присоединяются к справке по плоскому файлу

Я не уверен, что об этом уже спрашивали - я долго искал, но ничего не нашел.

Мой конечный результат - получить данные из нескольких таблиц базы данных SQL в плоский файл с разделителями-запятыми. Обычно это не было бы проблемой, но из-за их отношения «многие к одному» и формата, который я вынужден использовать, это оказывается.

1-й У меня есть одна таблица, таблица отчета, в которой есть вся основная информация для отчета. Например

CREATE TABLE tblReportExample
(
    ReportID int,
    ReportMonth smalldatetime,
    ReportDetails varchar(500)
)

2-й. У меня есть еще одна таблица с делами для каждого отчета.

CREATE TABLE tblReportCasesExample
(
    ReportID int,
    ReportCase varchar(50)
)

3-й У меня есть определение плоского файла со следующим:

ReportID, ReportMonth, ReportDetails, ReportCase1, ReportCase2, ReportCase3

Что мне нужно сделать, так это добавить три верхних случая из tblReportCasesExample для отчета, каким-то образом соединить их с данными в tblReportExample и добавить их в плоский файл как ReportCase1, 2 и 3.

Я смотрел на это весь день и никак не мог понять.

Любые идеи?


person Seninoniwashi    schedule 26.08.2009    source источник
comment
Когда вы говорите «3 основных случая», как они определяются? По дате или что-то еще?   -  person landyman    schedule 26.08.2009
comment
Топ-3 - это любые три случая для этого отчета (ReportID). Нет никакого способа справиться с безумием. Просто на моей стороне, у меня может быть неограниченное количество дел для отчета, а в их плоском файле есть место только для трех.   -  person Seninoniwashi    schedule 26.08.2009


Ответы (5)


Предлагаемое обновление вашего вопроса: не просто «плоский файл», а «файл CSV». Предположительно, файл CSV - это экспорт в другую систему или просто для кого-то, кто любит просматривать вещи в Excel :-)

Еще один комментарий от старого таймера (имеется в виду того, кто проделал БОЛЬШУЮ работу по интеграции системы передачи файлов): не весь мир является базой данных SQL. Особенно, если вам не нужна «ACID» для задачи (кроме транзакции вокруг начального (ых) извлечения (ов)).

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

Считайте данные tblReportCasesExample в какую-либо проиндексированную структуру данных.

Перебираем данные tblReportExample:

  • выберите ваши "любимые" tblReportCasesExample записи

  • дамп полей tblReportExample, за которыми следуют значения выбора (ключа) из соответствующих строк / строк tblReportCasesExample.

Найдите библиотеку обработки CSV, если у вас есть специальные символы в данных. В противном случае просто используйте «split» (perl и java имеют что-то подобное, я подозреваю, что библиотека .NET тоже).

Вам вообще нужна дополнительная информация / помощь?

person Roboprog    schedule 27.08.2009
comment
Это хорошая идея, мне придется ее поднять, когда я наберу достаточно очков репутации для этого. Это SQL, который запускается созданной мной службой Windows. Полагаю, я мог бы вставить свои данные в служебный код и переупорядочить их, а затем вернуть в SQL. Я мог бы сделать это тем временем, чтобы запустить эту штуку. Однако я хотел бы, чтобы тема оставалась открытой - я действительно зациклен на том, чего мне не хватает в моем коде SQL. Спасибо, что вытащили меня из коробки Робопрог - person Seninoniwashi; 28.08.2009
comment
В качестве альтернативы выгрузите управляющую таблицу во временную таблицу (в SQL) и выполните процедурную логику в хранимой процедуре. Просмотрите временную таблицу и добавьте 1, 2, 3 записи, используя прямую, хотя и медленную, условную логику внутри цикла. Затем просто выберите * из #my_temp в конце процедуры. - person Roboprog; 28.08.2009
comment
Да, это то, что я могу концептуально визуализировать ... позвольте мне попробовать это с помощью sproc и посмотреть, как далеко я смогу продвинуться. Спасибо Робопрог - person Seninoniwashi; 02.09.2009

Убедитесь, что вы используете здесь правильные идентификаторы. Я не понимаю, что вам нужно.

Насколько я понял, ваша проблема одна из двух:

1. один отчет указывает на несколько случаев дела могут быть назначены нескольким отчетам

для этого потребуется соединение "многие ко многим".

2. один отчет указывает на несколько случаев. Один случай может быть назначен одному отчету.

это один ко многим

Во втором пункте я не вижу, что вызывает у вас проблемы, пожалуйста, поясните.

person ilya.devyatovsky    schedule 26.08.2009

ReportID в таблице случаев - это тот же ReportID в таблице отчетов. Сценарий 2 - моя проблема. Я могу получить один случай с левым внешним соединением, но не могу найти творческий способ добраться до двух других:

SELECT re.ReportID, re.ReportMonth, re.ReportDeails, rce.ReportCase 
FROM tblReportExample re 
LEFT OUTTER JOIN tblReportCasesExample rce 
ON(re.ReportID = rce.ReportID)
person Seninoniwashi    schedule 26.08.2009

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

CREATE TABLE tblReportCasesExample
(
    CaseID int,
    ReportID int,
    ReportCase varchar(50)
)

Что вызывает у меня недоумение: зачем вам нужен текстовый файл?

person ilya.devyatovsky    schedule 26.08.2009

Я не тестировал это на MS SQL Server (что я сделал вывод из вашего использования типа данных smalldatetime), но я видел несколько статей о трюках, которые можно использовать с FOR XML PATH.

SELECT r.*,
  (SELECT TOP 3 c.ReportCase + ',' AS [text()]
   FROM tblReportCasesExample c
   WHERE c.ReportId = r.ReportId
   FOR XML PATH('')
  ) AS ReportCaseList
FROM tblReportExample r;

В результате должны быть столбцы tblReportExample, а также разделенная запятыми строка с тремя главными случаями отчета. Тогда, возможно, в файле CSV вы не узнаете, что некоторые запятые были частью этой строки, а не разделяли столбцы. :-)

person Bill Karwin    schedule 23.09.2009