2009-08-26 2 views
1

Я не уверен, что это уже было задано - я немного огляделся, но ничего не мог найти.Много к одному присоединяются к помощи для плоского файла

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

1st У меня есть одна таблица, таблица отчетов, которая содержит всю базовую информацию для отчета. Например,

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

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

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

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

ReportID, ReportMonth, ReportDetails, ReportCase1, ReportCase2, ReportCase3

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

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

Любые идеи?

+0

Когда вы говорите «топ-3», как определяется верхняя 3? По дате или что-то еще? – landyman

+0

«Топ-3» - это любые три случая для этого отчета (ReportID.) Нет безумия. Это просто на моей стороне. У меня могут быть неограниченные случаи для отчета, и у них есть только место в их плоском файле для 3. – Seninoniwashi

ответ

0

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

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

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

что бы требует многие к -новое соединение.

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

, что это один-ко-многим

Во 2-м пункте, я не могу видеть, что заставляет вас проблема, пожалуйста, уточните.

0

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

SELECT re.ReportID, re.ReportMonth, re.ReportDeails, rce.ReportCase 
FROM tblReportExample re 
LEFT OUTTER JOIN tblReportCasesExample rce 
ON(re.ReportID = rce.ReportID) 
0

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

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

Что вызывает мое замешательство, почему вам нужен текстовый файл?

1

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

Еще один комментарий от старого таймера (то есть кто-то, кто сделал MUCH file integration system integration work) : Не во всем мире есть база данных SQL. Особенно, если вам не нужна «ACID» для задачи (кроме транзакции вокруг исходного (ых) выводов).

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

Прочтите данные «tblReportCasesExample» в некотическую структуру индексированных данных.

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

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

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

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

Нужна более подробная информация/уход?

+0

Это хорошая идея, мне нужно будет это сделать, когда я получу достаточное количество очков для этого. Это SQL, который запускается службой Windows, которую я создал. Полагаю, я мог бы вытащить свои данные в служебный код и перестроить его, а затем вернуть в SQL. Я просто могу сделать это в промежутке, чтобы запустить эту работу. Однако я бы хотел, чтобы поток был открыт - я действительно зациклен на том, чего не хватает в своем SQL-коде. Спасибо за то, что вытащили меня за пределы поля Roboprog. – Seninoniwashi

+0

В качестве альтернативы, выведите контрольную таблицу в таблицу temp (внутри SQL) и выполните процедурную логику в хранимой процедуре. Перейдите по временной таблице и добавьте записи «1, 2, 3», используя прямую, хотя и медленную условную логику в цикле. Затем просто выберите «select * from #my_temp» в конце proc. – Roboprog

+0

Да, это то, что я могу представить концептуально ... позвольте мне попробовать его с sproc и посмотреть, как далеко я смогу добраться. Благодаря Roboprog – Seninoniwashi

0

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

Смежные вопросы