2014-09-08 2 views
1

Вот запрос, который работает:Дублирование записей в результате запроса

SELECT T_ActionTicketLog.ActionTicketID 
    ,T_ActionTicketLog.BarCode 
    ,T_ActionTicketLog.UserID 
    ,T_TicketStatus.Name 
    ,T_OrderTicket.OrderID 
FROM T_ActionTicketLog 
INNER JOIN T_TicketStatus 
    ON T_ActionTicketLog.StatusID = T_TicketStatus.ID 
LEFT OUTER JOIN T_OrderTicket 
    ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID 
where T_ActionTicketLog.ActionTicketID = 21780101 

Есть 27 записей возвращается, что это нормально.

Но я хочу добавить еще одно поле для набора результатов таким образом:

SELECT T_ActionTicketLog.ActionTicketID 
    ,T_ActionTicketLog.BarCode 
    ,T_ActionTicketLog.UserID 
    ,T_TicketStatus.Name 
    ,T_OrderTicket.OrderID 
    ,T_TicketPrint.TicketBarCode 
FROM T_ActionTicketLog 
INNER JOIN T_TicketStatus 
    ON T_ActionTicketLog.StatusID = T_TicketStatus.ID 
LEFT OUTER JOIN T_OrderTicket 
    ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID 
LEFT OUTER JOIN T_TicketPrint 
    ON T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID 
where T_ActionTicketLog.ActionTicketID = 21780101 

Есть 165 записей возвращается, что неправильно.

Дополнительное левое внешнее соединение делает проблему.

Таблицы:

CREATE TABLE [T_ActionTicketLog](
    [ID] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, 
    [ActionTicketID] [bigint] NULL, 
    [TicketOrderID] [bigint] NULL, 
    [StatusID] [tinyint] NULL, 
    [UserID] [int] NULL, 
    [SalerID] [int] NULL, 
    [FiscalID] [int] NULL, 
    [BarCode] [bigint] NULL, 
    [ReservDate] [datetime] NULL, 
    [Created] [datetime] NULL, 
    [Comments] [varchar](50) NULL, 

CREATE TABLE [T_TicketStatus](
    [ID] [tinyint] NOT NULL, 
    [Name] [varchar](50) NULL, 
    [Created] [datetime] NULL, 


CREATE TABLE [T_TicketPrint](
    [ID] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, 
    [CashierID] [int] NULL, 
    [BarCode] [bigint] NULL, 
    [ControlDigit] [tinyint] NULL, 
    [ActionTicketID] [bigint] NULL, 
    [Created] [datetime] NULL, 
    [CancelDate] [datetime] NULL, 
    [TicketBarCode] [varchar](250) NULL, 
    [OrderTicketID] [bigint] NULL, 
    [SetId] [bigint] NULL, 

CREATE TABLE [T_OrderTicket](
    [ID] [bigint] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL, 
    [OrderID] [int] NULL, 
    [ActionTicketID] [bigint] NULL, 
    [Status] [smallint] NULL, 
    [Created] [datetime] NULL, 
    [UserID] [int] NULL, 

Как добавить дополнительное поле без дублирования записей?

+0

Не могли бы вы предоставить данные о некоторых образцах? – Milen

ответ

0

Есть несколько способов, вы можете идти об этом (группировка, подзапрос, и т.д.), здесь является группировка по маршруту:

SELECT T_ActionTicketLog.ActionTicketID 
    ,T_ActionTicketLog.BarCode 
    ,T_ActionTicketLog.UserID 
    ,T_TicketStatus.Name 
    ,T_OrderTicket.OrderID 
    ,MAX(T_TicketPrint.TicketBarCode) 
FROM T_ActionTicketLog 
INNER JOIN T_TicketStatus 
    ON T_ActionTicketLog.StatusID = T_TicketStatus.ID 
LEFT OUTER JOIN T_OrderTicket 
    ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID 
LEFT OUTER JOIN T_TicketPrint 
    ON T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID 
WHERE T_ActionTicketLog.ActionTicketID = 21780101 
GROUP BY T_ActionTicketLog.ActionTicketID 
    ,T_ActionTicketLog.BarCode 
    ,T_ActionTicketLog.UserID 
    ,T_TicketStatus.Name 
    ,T_OrderTicket.OrderID 

Вы, возможно, потребуется изменить MAX() агрегат на что-то другое, что делает больше смысла в зависимости от того, как нужно обрабатывать несколько TicketPrints, связанных с OrderTicket.

1

Я думаю, что проблема в том, что у вас есть кратная запись в T_TicketPrint для каждой записи в T_OrderTicket, но вы только хотите, чтобы отобразить одну из этих записей, в этом случае я бы изменял LEFT JOIN к наружному ОТНОСИТЬСЯ, и просто выбрать топ 1 запись:

SELECT T_ActionTicketLog.ActionTicketID, 
     T_ActionTicketLog.BarCode, 
     T_ActionTicketLog.UserID, 
     T_TicketStatus.Name, 
     T_OrderTicket.OrderID, 
     tp.TicketBarCode 
FROM T_ActionTicketLog 
     INNER JOIN T_TicketStatus 
      ON T_ActionTicketLog.StatusID = T_TicketStatus.ID 
     LEFT OUTER JOIN T_OrderTicket 
      ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID 
     OUTER APPLY 
     ( SELECT TOP 1 TicketBarCode 
      FROM T_TicketPrint 
      WHERE T_OrderTicket.ActionTicketID = T_TicketPrint.ActionTicketID 
      ORDER BY T_TicketPrint.Created DESC -- NEWEST RECORD 
     ) AS tp 
WHERE T_ActionTicketLog.ActionTicketID = 21780101 

Поскольку вы можете иметь несколько записей в T_TicketPrint реальный вопрос становится какой из них следует выбрать? В приведенном выше примере я принял последний, но если это неверно, просто измените порядок order by в OUTER APPLY.

1

Ваш запрос возвращает 165 записей, поскольку T_TicketPrint имеет несколько записей для одного билета. Итак, вам нужна одна запись для билета из таблицы T_TicketPrint.

Для этого я использую группу ActionTicketID в T_TicketPrint и получаю штрих-код. Ваш запрос выглядит и изменяется в соответствии с требованием:

SELECT T_ActionTicketLog.ActionTicketID, T_ActionTicketLog.BarCode, T_ActionTicketLog.UserID, 
     T_TicketStatus.Name, T_OrderTicket.OrderID, A.TicketBarCode 
FROM T_ActionTicketLog INNER JOIN T_TicketStatus ON T_ActionTicketLog.StatusID = T_TicketStatus.ID 
LEFT OUTER JOIN T_OrderTicket ON T_ActionTicketLog.TicketOrderID = T_OrderTicket.ID 
LEFT OUTER JOIN 
(select TicketBarCode, ActionTicketID from T_TicketPrint 
group by ActionTicketID,TicketBarCode) as A ON T_OrderTicket.ActionTicketID = A.ActionTicketID 
where T_ActionTicketLog.ActionTicketID = 21780101 
+0

если штрих-код такой же, вам не нужно группировать столбец статического значения. – jainvikram444

+0

Кроме того, я обновляю запрос в соответствии с предложением – jainvikram444

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