Как объединить две или более строк на основе их внешнего ключа?

У меня есть три таблицы, которые:

A(a1, a2, a3)

//This tbl (Table) can have multiple instances of a1, but cause of its dependence on b1, 
//we have a unique record each time
B(b1, a1, b2)

//tbl C has a relationship with tbl B through b1. b1 can also have multiple instances, but 
//sometimes a number of unique records in this table can tie to just one record in the B tbl.
C(c1, b1, c2, c3)

Пример:

//Table B sample data
b1     a1     b2
1      25     paper
2      29     pencil
3      29     parker

//Table C sample data
c1     b1     c2     c3
1      1      w      long
2      2      b      long
3      2      g      short
4      3      v      fat

Объяснение: Для записи 2 в таблице B записи 2 и 3 в таблице C должны образовывать для нее одну запись.

Из всего, что было до сих пор, таблица A может иметь несколько записей в таблице B, которые отличаются от таблицы A. Таблица B также может иметь несколько записей в таблице C, но эти несколько записей должны быть объединены в одну запись (где бы ни было дублировать внешний ключ в таблице C, тогда должно произойти слияние).

Я надеюсь, что я сделал хорошую работу по объяснению моей проблемы. Мне нужен запрос, чтобы сделать это. Кто-нибудь может помочь, пожалуйста?

Дополнение № 1: Чтобы прояснить ситуацию, я буду использовать реальную ситуацию, с которой столкнулся.

Каждое лекарство сгруппировано по основной классификации, подклассу и общему названию.

-Main Classification
 -Sub Classification
  -Generic Name

Каждое родовое имя может иметь более одной силы: Пример:

 -TRIMETHOPRIM
  Strengths: 100mg, 200mg

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

 -SULFAMETHOXAZOLE & TRIMETHOPRIM
  Strengths: 40mg & 8mg/mL, 400mg & 80mg, 800mg & 160mg

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

GenericTbl(Id, Name, ...)
GenericDetails(Id, GenericId, ...)
Strenghts(Id, GenericDetailsId, Strength, Unit, DosageForm, ...)

Надеюсь, это поможет.

Дополнение № 2. Я изменил идентификаторы на целые числа вместо guid (uniqueidentifier)

Pharmacy_GenericDrug
GenericDrugID     GenericDrugName               DrugSubClassificationID     ControlStatusID
1                 TRIMETHOPRIM                  12                          2
2                 SULFAME & TRIMETHOPRIM        4                           1

Pharmacy_GenericDrugDetails
GenericDrugDetailsID       GenericDrugID
1                          1
2                          2



Pharmacy_Strengths
StrengthID         GenericDrugDetailsID       DosageStrength        Unit
1                  1                          200                   mg
2                  2                          80                    mg
3                  2                          8                     mg/L


For the first#1 GenericDrugID = 1: TRIMETHOPRIM | 12 | 200 | mg | 1

For the second#2 GenericDrugID = 2: SULFAME & TRIMETHOPRIM | 4 | 80 | mg | 8 | mg/L | 1

1 > GenericDrugName | DrugSubClassificationID | DosageSrength | Unit | ControlStatusID

2 > GenericDrugName | DrugSubClassificationID | DosageSrength | Unit | DosageSrength | Unit | ControlStatusID

person Tebo    schedule 18.11.2009    source источник
comment
Что вы подразумеваете под слиянием? Объединить, Мин, Макс?   -  person Adriaan Stander    schedule 18.11.2009
comment
Это действительно очень трудно понять, все эти А, Б и С. Нельзя ли было проще или немного конкретнее? Можете ли вы показать ожидаемый результат? Что вы подразумеваете под слиянием? Это изменение данных в базе или просто написание запроса, где эти данные сгруппированы?   -  person Stefan Steinegger    schedule 18.11.2009
comment
Если объединить записи с c1=2 и c1=3 в одну запись, то поля c2 и c3 должны как-то объединяться, верно? Не могли бы вы объяснить, почему вы хотите это сделать? Поскольку результирующая база данных больше не будет нормализована из-за неатомарных значений в столбцах c2 и c3.   -  person Tom Bartel    schedule 18.11.2009
comment
@Astander: Думаю, это больше похоже на присоединение. Скажем, 2 | 29 | 2 | б | длинный | г | короткая. Это должен быть результат для записи 2 в таблице B. @Stefan: Я скоро сделаю это более ясным в модификации. @Tom: у тебя есть то, о чем я говорю. На самом деле таблицы нормализованы, они будут ненормализованы только в памяти (после выполнения запроса).   -  person Tebo    schedule 18.11.2009
comment
не могли бы вы просто опубликовать пример значений в этих таблицах и результат, который вы ожидаете после упомянутой операции слияния. Даже после вашего редактирования трудно понять, чего вы хотите достичь.   -  person kristof    schedule 18.11.2009
comment
Я только что рассказал об использовании курсора. Позвольте мне попробовать это и вернуться к вам на детали.   -  person Tebo    schedule 18.11.2009


Ответы (3)


Это запрос, который объединяет две строки на основе внешнего ключа (нарушает правило 1NF).

DECLARE @StrengthID INT
DECLARE @GenericDrugDetailsID INT
DEClARE @DosageStrength INT
DECLARE @PresentationUnitID INT
DECLARE @DosageFormID INT
DECLARE @RouteOfAdministrationID INT

DECLARE @nCombinations INT
DECLARE @maxCombinations INT
DECLARE @CurrCombinationTotal INT
DECLARE @CurrGenericDrugDetailsID INT

DECLARE @PName VARCHAR(100)
DECLARE @DName VARCHAR(100)
DECLARE @DNameAbbrev VARCHAR(50)
DECLARE @RName VARCHAR(100)

DECLARE @GetGenericDrugStrengths CURSOR

SET @nCombinations = 0
SET @CurrGenericDrugDetailsID = 0

--Get the maximum number of combinations
--=====================================================================================
SET @maxCombinations = (SELECT TOP 1 COUNT(GenericDrugDetailsID) AS maxCombinations
FROM Pharmacy_Strengths
GROUP BY GenericDrugDetailsID
ORDER BY maxCombinations desc)
--=====================================================================================

--Create a temporary temp to hold the strengths
--=====================================================================================
DECLARE @tmpSQL VARCHAR(max)
SET @tmpSQL = ''

IF  EXISTS (SELECT * FROM tempdb.sys.tables WHERE NAME LIKE '%tmpStrengths%')
DROP TABLE #tmpStrengths

CREATE TABLE #tmpStrengths (
         StrengthID INT NOT NULL,
         GenericDrugDetailsID INT NOT NULL,
         NumberOfCombinations INT NOT NULL,
         DosageStrength1 INT NOT NULL,
         PresentationUnitID1 INT NOT NULL,
         PresentationUnitName1 VARCHAR(100) NOT NULL,
         DosageFormID1 INT NOT NULL,
         DosageFormName1 VARCHAR(100) NOT NULL,
         DosageFormNameAbbrev1 VARCHAR(50) NULL,
         RouteOfAdministrationID1 INT NOT NULL,
         RouteOfAdministrationName1 VARCHAR(100) NOT NULL);

             IF (@maxCombinations > 1)
             BEGIN

                 DECLARE @counter int
                 SET @counter = 1                

                 WHILE @counter < @maxCombinations
                 BEGIN
                    SET @counter = @counter + 1
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD StrengthID' + CAST(@counter AS VARCHAR(50)) + ' INT NULL;'
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD DosageStrength' + CAST(@counter AS VARCHAR(50)) + ' INT NULL;'
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD PresentationUnitID' + CAST(@counter AS VARCHAR(50)) + ' INT NULL; '
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD PresentationUnitName' + CAST(@counter AS VARCHAR(100)) + ' VARCHAR(100) NULL; '
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD DosageFormID' + CAST(@counter AS VARCHAR(50)) + ' INT NULL; '
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD DosageFormName' + CAST(@counter AS VARCHAR(100)) + ' VARCHAR(100) NULL; '
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD DosageFormNameAbbrev' + CAST(@counter AS VARCHAR(50)) + ' VARCHAR(50) NULL; '
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD RouteOfAdministrationID' + CAST(@counter AS VARCHAR(50)) + ' INT NULL; '
                    SET @tmpSQL = @tmpSQL + 'ALTER TABLE #tmpStrengths ADD RouteOfAdministrationName' + CAST(@counter AS VARCHAR(100)) + ' VARCHAR(100) NULL; '
                 END
             END
EXEC(@tmpSQL)
--====================================================================================
SET @tmpSQL = ''
SET @GetGenericDrugStrengths = CURSOR FOR 
    SELECT StrengthID, GenericDrugDetailsID, DosageStrength, PresentationUnitID, DosageFormID, RouteOfAdministrationID
    FROM Pharmacy_Strengths
    ORDER BY GenericDrugDetailsID ASC

OPEN @GetGenericDrugStrengths
    FETCH NEXT FROM @GetGenericDrugStrengths INTO @StrengthID, @GenericDrugDetailsID, @DosageStrength, @PresentationUnitID, @DosageFormID, @RouteOfAdministrationID

    WHILE @@FETCH_STATUS = 0
    BEGIN

        --Get the values of Presentation Unit, Dosage Form, and Route of Administration.
        SELECT @PName = PresentationUnitName
        FROM Pharmacy_PresentationUnit
        WHERE PresentationUnitID = @PresentationUnitID

        SELECT @DName = DosageFormName, @DNameAbbrev = DosageFormNameAbbrev
        FROM Pharmacy_DosageForm
        WHERE DosageFormID = @DosageFormID

        SELECT @RName = RouteOfAdministrationName
        FROM Pharmacy_RouteOfAdministration
        WHERE RouteOfAdministrationID = @RouteOfAdministrationID

        IF (@GenericDrugDetailsID = @CurrGenericDrugDetailsID)
            BEGIN
                SET @nCombinations = (@nCombinations + 1)

                --Alter the temporary table now
                SET @tmpSQL = @tmpSQL + 'UPDATE #tmpStrengths
                    SET StrengthID' + CAST(@nCombinations AS VARCHAR(50)) + ' = ' + CAST(@StrengthID AS VARCHAR(50)) + ',
                        DosageStrength' + CAST(@nCombinations AS VARCHAR(50)) + ' = ' + CAST(@DosageStrength AS VARCHAR(50)) + ',
                        PresentationUnitID' + CAST(@nCombinations AS VARCHAR(50)) + ' = ' + CAST(@PresentationUnitID AS VARCHAR(50)) + ',
                        PresentationUnitName' + CAST(@nCombinations AS VARCHAR(50)) + ' = ''' + CAST(@PName AS VARCHAR(100)) + ''',
                        DosageFormID' + CAST(@nCombinations AS VARCHAR(50)) + ' = ' + CAST(@DosageFormID AS VARCHAR(50)) + ',
                        DosageFormName' + CAST(@nCombinations AS VARCHAR(50)) + ' = ''' + CAST(@DName AS VARCHAR(100)) + ''',
                        DosageFormNameAbbrev' + CAST(@nCombinations AS VARCHAR(50)) + ' = ''' + CAST(@DNameAbbrev AS VARCHAR(50)) + ''',
                        RouteOfAdministrationID' + CAST(@nCombinations AS VARCHAR(50)) + ' = ' + CAST(@RouteOfAdministrationID AS VARCHAR(50)) + ',
                        RouteOfAdministrationName' + CAST(@nCombinations AS VARCHAR(50)) + ' = ''' + CAST(@RName AS VARCHAR(100)) + '''
                    WHERE GenericDrugDetailsID = ' + CAST(@GenericDrugDetailsID AS VARCHAR(50));
                EXEC(@tmpSQL);
            END
        ELSE
            BEGIN
                SET @nCombinations = 1
                SET @CurrGenericDrugDetailsID = @GenericDrugDetailsID;

                --Get the total number of combinations in advance
                SET @CurrCombinationTotal = (SELECT COUNT(GenericDrugDetailsID)
                FROM Pharmacy_Strengths
                WHERE GenericDrugDetailsID = @GenericDrugDetailsID
                GROUP BY GenericDrugDetailsID);

                --Insert in the temporary table now
                INSERT INTO #tmpStrengths (StrengthID, GenericDrugDetailsID, NumberOfCombinations, 
                                    DosageStrength1, PresentationUnitID1, PresentationUnitName1, DosageFormID1, 
                                    DosageFormName1, DosageFormNameAbbrev1, RouteOfAdministrationID1, RouteOfAdministrationName1)
                VALUES (@StrengthID, @GenericDrugDetailsID, @CurrCombinationTotal, @DosageStrength, 
                        @PresentationUnitID, @PName, @DosageFormID, @DName, @DNameAbbrev, @RouteOfAdministrationID, @RName)
            END

        --PRINT CAST(@StrengthID AS varchar(50)) + ' ' + CAST(@GenericDrugDetailsID AS varchar(50)) + ' ' + CAST(@DosageStrength AS varchar(50)) + ' ' + CAST(@PresentationUnitID AS varchar(50)) + ' ' + CAST(@DosageFormID as varchar(50)) + ' ' + CAST(@RouteOfAdministrationID as varchar(50))
        FETCH NEXT FROM @GetGenericDrugStrengths INTO @StrengthID, @GenericDrugDetailsID, @DosageStrength, @PresentationUnitID, @DosageFormID, @RouteOfAdministrationID
    END
    --SELECT * from #tmpStrengths
CLOSE @GetGenericDrugStrengths
DEALLOCATE @GetGenericDrugStrengths

SELECT a.GenericDrugID, 
       a.GenericDrugName,
       f.*,
       a.InsertDate, 
       a.InsertFKUserAccountId, 
       a.UpdateDate, 
       a.UpdateFKUserAccountId, 
       a.Version
FROM Pharmacy_GenericDrug a
INNER JOIN Pharmacy_ControlStatus d ON d.ControlStatusID = a.ControlStatusID
INNER JOIN Pharmacy_GenericDrugDetails e ON e.GenericDrugID = a.GenericDrugID
INNER JOIN #tmpStrengths f ON f.GenericDrugDetailsID = e.GenericDrugDetailsID
ORDER BY GenericDrugName ASC

Это то, что я получаю перед запросом:

GenericDrugID                        GenericDrugName                                                                                      DrugSubClassificationID              DrugSubClassificationName                                                                                                                                                                                DrugClassificationID                 DrugClassificationName                                                                                                                                                                                   GenericDrugDetailsID DosageStrength PresentationUnitID PresentationUnitName                                                                                 DosageFormID DosageFormName                                                                                       DosageFormNameAbbrev                               RouteOfAdministrationID RouteOfAdministrationName                                                                            ControlStatusID ControlStatusName                                                                                    InsertDate              InsertFKUserAccountId UpdateDate              UpdateFKUserAccountId Version
------------------------------------ ---------------------------------------------------------------------------------------------------- ------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -------------------- -------------- ------------------ ---------------------------------------------------------------------------------------------------- ------------ ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ----------------------- ---------------------------------------------------------------------------------------------------- --------------- ---------------------------------------------------------------------------------------------------- ----------------------- --------------------- ----------------------- --------------------- -----------------------
83222B76-6690-42F2-BDAD-BE5BD2D19D3B Generic Drug One                                                                                     8ED135ED-5FDB-419A-9C7D-E788A40EAEAC Drug Subclassification Two                                                                                                                                                                               61D618F3-A38A-4416-B0A4-FB29AD614B4B Drug Classification One                                                                                                                                                                                  2                    300            1                  ml                                                                                                   2            Pill                                                                                                 Pill                                               1                       Mouth                                                                                                3               Narcotic                                                                                             2009-10-25 10:10:06.077 1                     2009-11-15 07:06:03.733 1                     2009-10-25 10:10:06.077
83222B76-6690-42F2-BDAD-BE5BD2D19D3B Generic Drug One                                                                                     8ED135ED-5FDB-419A-9C7D-E788A40EAEAC Drug Subclassification Two                                                                                                                                                                               61D618F3-A38A-4416-B0A4-FB29AD614B4B Drug Classification One                                                                                                                                                                                  2                    400            1                  ml                                                                                                   2            Pill                                                                                                 Pill                                               1                       Mouth                                                                                                3               Narcotic                                                                                             2009-10-25 10:10:06.077 1                     2009-11-15 07:06:03.733 1                     2009-10-25 10:10:06.077
83222B76-6690-42F2-BDAD-BE5BD2D19D3B Generic Drug One                                                                                     8ED135ED-5FDB-419A-9C7D-E788A40EAEAC Drug Subclassification Two                                                                                                                                                                               61D618F3-A38A-4416-B0A4-FB29AD614B4B Drug Classification One                                                                                                                                                                                  4                    500            1                  ml                                                                                                   2            Pill                                                                                                 Pill                                               2                       Injection                                                                                            3               Narcotic                                                                                             2009-10-25 10:10:06.077 1                     2009-11-15 07:06:03.733 1                     2009-10-25 10:10:06.077
A1D86FD2-2E65-4F2A-B7A2-7B083B71AB9B Generic Drug Two                                                                                     9925D762-34B8-43B4-A96B-78374F0081B0 Drug Subclassification One                                                                                                                                                                               C10E9F1B-3985-4DB8-8EF8-A6C82B004B9F Drug Classification Two                                                                                                                                                                                  1                    200            1                  ml                                                                                                   2            Pill                                                                                                 Pill                                               1                       Mouth                                                                                                2               None                                                                                                 2009-10-25 10:47:10.623 1                     2009-11-15 04:02:47.890 1                     2009-10-25 10:47:10.623

Это то, что я получаю сейчас:

GenericDrugID                        GenericDrugName                                                                                      DrugSubClassificationID              DrugSubClassificationName                                                                                                                                                                                DrugClassificationID                 DrugClassificationName                                                                                                                                                                                   StrengthID  GenericDrugDetailsID NumberOfCombinations DosageStrength1 PresentationUnitID1 PresentationUnitName1                                                                                DosageFormID1 DosageFormName1                                                                                      DosageFormNameAbbrev1                              RouteOfAdministrationID1 RouteOfAdministrationName1                                                                           StrengthID2 DosageStrength2 PresentationUnitID2 PresentationUnitName2                                                                                DosageFormID2 DosageFormName2                                                                                      DosageFormNameAbbrev2                              RouteOfAdministrationID2 RouteOfAdministrationName2                                                                           InsertDate              InsertFKUserAccountId UpdateDate              UpdateFKUserAccountId Version
------------------------------------ ---------------------------------------------------------------------------------------------------- ------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------ -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------- -------------------- -------------------- --------------- ------------------- ---------------------------------------------------------------------------------------------------- ------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ------------------------ ---------------------------------------------------------------------------------------------------- ----------- --------------- ------------------- ---------------------------------------------------------------------------------------------------- ------------- ---------------------------------------------------------------------------------------------------- -------------------------------------------------- ------------------------ ---------------------------------------------------------------------------------------------------- ----------------------- --------------------- ----------------------- --------------------- -----------------------
83222B76-6690-42F2-BDAD-BE5BD2D19D3B Generic Drug One                                                                                     8ED135ED-5FDB-419A-9C7D-E788A40EAEAC Drug Subclassification Two                                                                                                                                                                               61D618F3-A38A-4416-B0A4-FB29AD614B4B Drug Classification One                                                                                                                                                                                  2           2                    2                    300             1                   ml                                                                                                   2             Pill                                                                                                 Pill                                               1                        Mouth                                                                                                3           400             1                   ml                                                                                                   2             Pill                                                                                                 Pill                                               1                        Mouth                                                                                                2009-10-25 10:10:06.077 1                     2009-11-15 07:06:03.733 1                     2009-10-25 10:10:06.077
83222B76-6690-42F2-BDAD-BE5BD2D19D3B Generic Drug One                                                                                     8ED135ED-5FDB-419A-9C7D-E788A40EAEAC Drug Subclassification Two                                                                                                                                                                               61D618F3-A38A-4416-B0A4-FB29AD614B4B Drug Classification One                                                                                                                                                                                  4           4                    1                    500             1                   ml                                                                                                   2             Pill                                                                                                 Pill                                               2                        Injection                                                                                            NULL        NULL            NULL                NULL                                                                                                 NULL          NULL                                                                                                 NULL                                               NULL                     NULL                                                                                                 2009-10-25 10:10:06.077 1                     2009-11-15 07:06:03.733 1                     2009-10-25 10:10:06.077
A1D86FD2-2E65-4F2A-B7A2-7B083B71AB9B Generic Drug Two                                                                                     9925D762-34B8-43B4-A96B-78374F0081B0 Drug Subclassification One                                                                                                                                                                               C10E9F1B-3985-4DB8-8EF8-A6C82B004B9F Drug Classification Two                                                                                                                                                                                  1           1                    1                    200             1                   ml                                                                                                   2             Pill                                                                                                 Pill                                               1                        Mouth                                                                                                NULL        NULL            NULL                NULL                                                                                                 NULL          NULL                                                                                                 NULL                                               NULL                     NULL                                                                                                 2009-10-25 10:47:10.623 1                     2009-11-15 04:02:47.890 1                     2009-10-25 10:47:10.623

Для тех, кто заинтересован, это структуры таблиц:

    CREATE TABLE [dbo].[Pharmacy_GenericDrug](
        [GenericDrugID] [uniqueidentifier] NOT NULL CONSTRAINT [DF__Pharmacy___Gener__4E53A1AA]  DEFAULT (newid()),
        [GenericDrugName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
        [DrugSubClassificationID] [uniqueidentifier] NOT NULL,
        [ControlStatusID] [int] NOT NULL,
        [InsertDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_GenericDrug_InsertDate]  DEFAULT (getdate()),
        [InsertFKUserAccountId] [int] NOT NULL,
        [UpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_GenericDrug_UpdateDate]  DEFAULT (getdate()),
        [UpdateFKUserAccountId] [int] NOT NULL,
        [Version] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_GenericDrug_Version]  DEFAULT (getdate())
    )


CREATE TABLE [dbo].[Pharmacy_GenericDrugDetails](
    [GenericDrugDetailsID] [int] IDENTITY(1,1) NOT NULL,
    [GenericDrugID] [uniqueidentifier] NOT NULL,
    [InsertDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_GenericDrugDetails_InsertDate]  DEFAULT (getdate()),
    [InsertFKUserAccountId] [int] NOT NULL,
    [UpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_GenericDrugDetails_UpdateDate]  DEFAULT (getdate()),
    [UpdateFKUserAccountId] [int] NOT NULL,
    [Version] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_GenericDrugDetails_Version]  DEFAULT (getdate())
)


CREATE TABLE [dbo].[Pharmacy_Strengths](
    [StrengthID] [int] IDENTITY(1,1) NOT NULL,
    [GenericDrugDetailsID] [int] NOT NULL,
    [DosageStrength] [int] NOT NULL,
    [PresentationUnitID] [int] NOT NULL,
    [DosageFormID] [int] NOT NULL,
    [RouteOfAdministrationID] [int] NOT NULL,
    [InsertDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_StrengthCombination_InsertDate]  DEFAULT (getdate()),
    [InsertFKUserAccountId] [int] NOT NULL,
    [UpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_StrengthCombination_UpdateDate]  DEFAULT (getdate()),
    [UpdateFKUserAccountId] [int] NOT NULL,
    [Version] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_StrengthCombination_Version]  DEFAULT (getdate())
)



CREATE TABLE [dbo].[Pharmacy_PresentationUnit](
    [PresentationUnitID] [int] IDENTITY(1,1) NOT NULL,
    [PresentationUnitName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [InsertDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_PresentationUnit_InsertDate]  DEFAULT (getdate()),
    [InsertFKUserAccountId] [int] NOT NULL,
    [UpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_PresentationUnit_UpdateDate]  DEFAULT (getdate()),
    [UpdateFKUserAccountId] [int] NOT NULL,
    [Version] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_PresentationUnit_Version]  DEFAULT (getdate())
)



CREATE TABLE [dbo].[Pharmacy_DosageForm](
    [DosageFormID] [int] IDENTITY(1,1) NOT NULL,
    [DosageFormName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [DosageFormNameAbbrev] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [InsertDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_DosageForm_InsertDate]  DEFAULT (getdate()),
    [InsertFKUserAccountId] [int] NOT NULL,
    [UpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_DosageForm_UpdateDate]  DEFAULT (getdate()),
    [UpdateFKUserAccountId] [int] NOT NULL,
    [Version] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_DosageForm_Version]  DEFAULT (getdate())
)


CREATE TABLE [dbo].[Pharmacy_RouteOfAdministration](
    [RouteOfAdministrationID] [int] IDENTITY(1,1) NOT NULL,
    [RouteOfAdministrationName] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [InsertDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_RouteOfAdministration_InsertDate]  DEFAULT (getdate()),
    [InsertFKUserAccountId] [int] NOT NULL,
    [UpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_RouteOfAdministration_UpdateDate]  DEFAULT (getdate()),
    [UpdateFKUserAccountId] [int] NOT NULL,
    [Version] [datetime] NOT NULL CONSTRAINT [DF_Pharmacy_RouteOfAdministration_Version]  DEFAULT (getdate())
)
person Community    schedule 18.11.2009
comment
Я хотел бы знать, есть ли какие-либо последствия для производительности при использовании этого запроса. - person Tebo; 19.11.2009

Хорошо, давайте попробуем и посмотрим, приведет ли это нас к чему-нибудь.

Таблица A: GenericTbl(Id, Name,...)

Таблица B: GenericDetails(Id, GenericId, ...)

Таблица C: Сильные стороны (Id, GenericDetailsId, Strong, Unit, DosageForm, ...)

Если, когда вы говорите о слиянии, вы ищете выходной набор, который объединяет результаты сильных сторон одного универсального, вы можете сделать что-то вроде

SELECT
 g.Id,
 g.Name,
 gd.Id,
 s.Strength,
 s.Unit,
 s.OtherFields /*fill in the blanks*/
FROM
 GenericTbl g
  INNER JOIN GenericDetails gd
   on g.Id=gd.GenericId
  INNER JOIN Strengths s
   ON gd.Id=s.GenericDetailsId
ORDER BY
 g.Id, gd.Id, s.Id

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

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

Если то, что вы на самом деле ищете, - это объединение записей при вставке в базу данных, поэтому у вас есть только одна базовая запись, содержащая все данные, тогда вы можете сделать это с помощью триггеров, но я не совсем понимаю, почему вы хотелось бы, потому что в итоге вы получите сопоставление 1: 1 для B и C и можете просто иметь их как одну таблицу.

person eftpotrm    schedule 18.11.2009
comment
Большое спасибо. Я сделал это, наконец, с курсорами и временной таблицей, как вы предложили. Вы можете посмотреть на пост выше, как я это придумал. Есть ли какие-либо последствия для производительности? - person Tebo; 19.11.2009

Вот еще одно решение с использованием SQLXML:

SELECT  
    STUFF  
    (  
        (  
        SELECT ', ' + cast(id AS NVARCHAR(max)) + ': ' + video  
        FROM Video
        ORDER BY Id  
        FOR XML PATH ('')  
        ),1,1,''  
    )

CREATE TABLE [dbo].[Video](
    [ID] [int] NOT NULL,
    [Video] [varchar](50) NOT NULL,
    [Views] [int] NOT NULL
)

Результат: 1: Халк, 2: Джек, 3: Король

Обновление: я также только что нашел это в разделе Управление данными и обмен.

person Community    schedule 21.11.2009