Много к одному присоединиться к справке для плоского файла - PullRequest
1 голос
/ 26 августа 2009

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

Мой конечный результат - получить данные из нескольких моих таблиц базы данных 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.

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

Есть идеи?

Ответы [ 5 ]

1 голос
/ 28 августа 2009

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

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

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

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

Итерация по данным "tblReportExample":

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

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

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

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

0 голосов
/ 23 сентября 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-файле вы не будете знать, что некоторые запятые были частью этой строки вместо разделения столбцов. : -)

0 голосов
/ 26 августа 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)
0 голосов
/ 26 августа 2009

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

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

Что вызывает у меня путаницу, так это зачем вам текстовый файл?

0 голосов
/ 26 августа 2009

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

Как я понял, ваша проблема - одна из этих двух:

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

, что потребовало бы соединения «многие ко многим».

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

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

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

...