Получите дочерние аккаунты

У меня есть эта структура таблицы и некоторые образцы данных. Логика здесь в том, что для любого COATitle я ввожу дочерние записи, которые представляют собой расходы по этому конкретному головному счету. В моем примере данные Medical имеют несколько дочерних записей и такие же, как Incentive.

Моя проблема в том, что когда я выбираю конкретную головную учетную запись, например, если я выбираю Medical, она должна показывать свои дочерние записи, в этом случае они не должны включать записи с MasterID 2, поскольку они относятся к Incentive.

CREATE TABLE TransactionMaster
(
ID Int,
TransactionCode VARCHAR(25),
PRIMARY KEY (ID)
)

INSERT INTO TransactionMaster VALUES (1, 'TRA-001');
INSERT INTO TransactionMaster VALUES (2, 'TRA-002');
INSERT INTO TransactionMaster VALUES (3, 'TRA-003');

CREATE TABLE TransactionDetail
(
ID Int,
MasterID Int,
COATitle VARCHAR(25),
CrAmount NUMERIC(18,2),
DrAmount NUMERIC(18,2),
PRIMARY KEY (ID),
FOREIGN KEY (MasterID) REFERENCES TransactionMaster(ID)
)


INSERT INTO TransactionDetail VALUES (1, 1, 'Medical', '2500', NULL)
INSERT INTO TransactionDetail VALUES (2, 1, 'Travelling', NULL, '2500')
INSERT INTO TransactionDetail VALUES (3, 1, 'Medicine', NULL, '2500')
INSERT INTO TransactionDetail VALUES (4, 1, 'Doc Fee', NULL, '2500')
INSERT INTO TransactionDetail VALUES (5, 2, 'Incentive', '3000', NULL)
INSERT INTO TransactionDetail VALUES (6, 2, 'Extra', NULL, '2500')
INSERT INTO TransactionDetail VALUES (7, 2, 'Bonus', NULL, '500')
INSERT INTO TransactionDetail VALUES (8, 3, 'Medical', NULL, '3000')
INSERT INTO TransactionDetail VALUES (9, 3, 'Tests', '2500', NULL)
INSERT INTO TransactionDetail VALUES (10, 3, 'Juice', '500', NULL)

Пример запроса:

SELECT [Voucher].[TransactionCode], [Detail].[COATitle], [Detail].[CrAmount], [Detail].[DrAmount] 
FROM [TransactionMaster] [Voucher], [TransactionDetail] [Detail]
WHERE [Voucher].[ID] = [Detail].[MasterID] AND COATitle NOT IN ('Medical')

Выход:

TransactionCode           COATitle                  CrAmount                                DrAmount
------------------------- ------------------------- --------------------------------------- ---------------------------------------
TRA-001                   Travelling                NULL                                    2500.00
TRA-001                   Medicine                  NULL                                    2500.00
TRA-001                   Doc Fee                   NULL                                    2500.00
TRA-002                   Incentive                 3000.00                                 NULL
TRA-002                   Extra                     NULL                                    2500.00
TRA-002                   Bonus                     NULL                                    500.00
TRA-003                   Tests                     2500.00                                 NULL
TRA-003                   Juice                     500.00                                  NULL

Желаемый результат не должен включать строки с TransactionCode с 'TRA-002'.

Вместо отношения родитель-потомок вам, вероятно, следует использовать hierarchyid. Это делает запросы намного проще и быстрее

Panagiotis Kanavos 26.10.2018 08:48

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

Doonie Darkoo 26.10.2018 08:51
2
2
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте следующий запрос

SELECT
  m.TransactionCode,
  d.COATitle,
  d.CrAmount,
  d.DrAmount
FROM TransactionDetail d
JOIN TransactionMaster m ON d.MasterID=m.ID
WHERE d.MasterID IN(
      SELECT MasterID
      FROM TransactionDetail
      WHERE COATitle='Medical'
    )
  AND d.COATitle<>'Medical'

Другие вопросы по теме