Генерация SQL (сводной) таблицы из нескольких других таблиц - PullRequest
1 голос
/ 02 декабря 2011

У меня есть подразделение, которое состоит из нескольких частей. У меня есть одна таблица для каждой части, которая выглядит примерно так:

Part#ID    PartBarcode   BuildDate   comments
------    -----------   ---------   --------
##        someBC        datetime    string
##        someBC        datetime    string
##        someBC        datetime    string
....

У меня есть 3 таблицы выше

Тогда у меня есть одна таблица подразделов, которая выглядит следующим образом:

PartID    PartSubBarcode1   PartSubBarcode1    PartSubBarcode1   BuildDate   comments
          (project code)    (intraproject S/N) (Antenna presence)
------    ---------------   ---------------    ---------------   ---------   --------
##        ABC               123                Z                 Datetime    string
##        ABC               124                X                 Datetime    string
##        ABC               125                Z                 Datetime    string

Редактировать: каждая из частей штрих-кода представляет физические / проектные атрибуты.

Когда все они собраны, и у меня есть таблица с составными частями

AssembledUnitID   Part1ID   Part2ID   Part3ID   Part4ID   ActiveState
---------------   -------   -------   -------   -------   -----------
##                ##        ##        ##        ##        true
##                ##        ##        ##        ##        false
##                ##        ##        ##        ##        true
...

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

Part1BC   Part1BuildDate Part2BC Part2BuildDate  ...
-------   -------------- ------- --------------

Конечной игрой здесь является заполнение объекта datagridview в WinForm в C # .NET, чтобы пользователь мог перемещаться и видеть состояние инвентаря. Было бы неплохо, чтобы это был один оператор SQL, заполняющий эту таблицу. Краткость кода на самом деле не важна, если конечный результат один и тот же.

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

Дополнительная информация: Я делаю winform с представлением сетки данных в C # .NET Я подключаюсь к базе данных Access 2007 .mdb. Я храню свои запросы в моем решении C # в файле .xsd. Нужна дополнительная информация?


EDIT: Сделал это! Вот что я сделал, чтобы решить эту проблему! В конструкторе C # .xsd я создал новый DataTable. Через адаптер таблицы таблицы данных я создал запрос с текстом, подобным этому:

SELECT 
            UnitBarcodes.GroupID + UnitBarcodes.Version
                + UnitBarcodes.SubSerial + UnitBarcodes.AntennaStatus AS [Unit Barcode],
            Subpart1.Barcode AS [part1 Board Barcode],
            Subpart2.Barcode AS [part2 Board Barcode],
            Subpart3.Barcode AS [part3 Board Barcode],
            AssembledUnits.DateAssembled AS [Date Assembled],
            Subpart1.OnBoardBuildDate AS [Firmware Build Date] FROM  ((((MainBoards INNER JOIN
            AssembledUnits ON Subpart1.ID = AssembledUnits.Subpart1ID)
    INNER JOIN
            UnitBarcodes ON AssembledUnits.UnitBarcodesID = UnitBarcodes.ID)
    INNER JOIN
            Subpart2 ON AssembledUnits.Subpart2ID = Subpart2.ID) 
    INNER JOIN
            Subpart3 ON AssembledUnits.Subpart3ID = Subpart3.ID)
    WHERE     (AssembledUnits.ActiveState = ?) AND (AssembledUnits.DateAssembled > ?)

Как только я заполняю таблицу данных, я установил

bindingSource1.DataSource=
dataGridView2.AutoResizeColumns();

(перед вызовом запроса я также установил 'dataGridView2.AutoGenerateColumns = true;' и, конечно, создал объект dataGridView2 в моей форме)

и вуаля! Оно работает! Какой опыт обучения (и намного проще, чем я думал)

Ответы [ 2 ]

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

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

сначала объявите ваш взгляд следующим образом:

(обратите внимание, что для удобства переименования я включил таблицу с именем в [скобках])

CREATE VIEW View_AllSubparts AS

SELECT PartID, PartBarcode AS 'Barcode', BuildDate FROM [SubpartTable1]
UNION
SELECT PartID, PartBarcode AS 'Barcode', BuildDate FROM [SubpartTable2]
UNION
SELECT PartID, PartBarcode AS 'Barcode', BuildDate FROM [SubpartTable3]
UNION
SELECT PartID, PartSubBarcode1 + PartSubBarcode2 + PartSubBarcode3 AS 'Barcode', BuildDate FROM [SpecialSubpartTable]
GO

С этого момента вы можете ссылаться на это представление в выражениях так же, как на таблицу.

Оттуда вы можете создать свой выбор для своих юнитов, присоединившись к этому представлению несколько раз

SELECT Part1.Barcode, Part1.BuildDate , Part2.Barcode, Part2.BuildDate , Part3.Barcode, Part3.BuildDate , Part4.Barcode, Part4.BuildDate 
FROM [AssembledUnit]
JOIN View_AllSubparts Part1 ON AssembledUnit.Part1ID = Part1.PartID
JOIN View_AllSubparts Part2 ON AssembledUnit.Part2ID = Part2.PartID
JOIN View_AllSubparts Part3 ON AssembledUnit.Part3ID = Part3.PartID
JOIN View_AllSubparts Part4 ON AssembledUnit.Part4ID = Part4.PartID

Обратите внимание, что я не использую Access 2007 регулярно, но я сделал быструю проверку, и я думаю, что здесь нет ничего, что Access не откажет. Дайте мне знать.

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

Не делайте этого в одном запросе

Это умеренно сложная проблема, которую вы делаете еще более сложной, не желая писать код.Кроме того, MS Access имеет больше ограничений по написанию запросов, чем база данных SQL Server, поэтому вам, вероятно, будет еще сложнее.

...