Использовать (несколько) результатов одного запроса в качестве входных данных для другого запроса - PullRequest
0 голосов
/ 21 ноября 2018

Я пишу билетную программу с использованием Vb.net и SQL

У меня есть 2 таблицы, которые мне нужно использовать в запросе.Одна таблица (Билеты) содержит все нужные мне значения.Во второй таблице (Ticketactions) содержатся все действия TicketActions, связанные с билетом

. Я хочу создать поиск, который выполняет поиск в следующих столбцах:

  • Ticket.description
  • ticket.ticketID
  • Ticketaction.ActionDescrition

У меня есть поиск, который хорошо работает и выполняет поиск в Таблице билетов

        SELECT 
    tickets.TicketNumber, 
    tickets.Description,
    tickets.departmentname,
    tickets.devicename,
    tickets.creatorname,
    tickets.creationdate,
    tickets.ExecutionDate,
    tickets.closedate
    stateName,
    PriorityName,
    FullName,
         FROM tickets
    INNER Join Users On Tickets.AssignedTo = Users.UserID
    INNER Join States On Tickets.StateID = States.StateID 
    INNER Join Priorities On Tickets.priority = Priorities.PriorityID 
         WHERE Description Like '%SEARCHTEXT%' OR TicketNumber Like '%SEARCHTEXT%'

Мне нужно развернуть запрос вышес дополнительными номерами TicketNumbers, которые являются результатом запроса в таблице TicketActions

    SELECT TicketNumber
    FROM dbo.ticketaction
    WHERE ActionDescription like '%SEARCHTEXT%' 

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

Любая помощь будет приветствоваться, поскольку я действительно не знаю, как к этому подойти

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

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

SELECT 
    tickets.TicketNumber, 
    tickets.Description,
    tickets.departmentname,
    tickets.devicename,
    tickets.creatorname,
    tickets.creationdate,
    tickets.ExecutionDate,
    tickets.closedate
    stateName,
    PriorityName,
    FullName,
FROM
           tickets
INNER Join Users      On Tickets.AssignedTo = Users.UserID
INNER Join States     On Tickets.StateID = States.StateID 
INNER Join Priorities On Tickets.priority = Priorities.PriorityID 
WHERE tickets.Description Like '%SEARCHTEXT%'
   OR tickets.TicketNumber Like '%SEARCHTEXT%'
   OR tickets.TicketNumber IN (SELECT TicketNumber
                                 FROM dbo.ticketaction
                                WHERE ActionDescription like '%SEARCHTEXT%'
                              )

Лучшим решением может быть использование JOIN в таблице ticketAction

SELECT 
    tickets.TicketNumber, 
    tickets.Description,
    tickets.departmentname,
    tickets.devicename,
    tickets.creatorname,
    tickets.creationdate,
    tickets.ExecutionDate,
    tickets.closedate
    stateName,
    PriorityName,
    FullName,
FROM
           tickets
INNER JOIN Users        ON tickets.AssignedTo = Users.UserID
INNER JOIN States       ON tickets.StateID = States.StateID 
INNER JOIN Priorities   ON tickets.priority = Priorities.PriorityID 
INNER JOIN ticketAction ON ticket.TicketNumber = ticketAction.TicketNumber
WHERE tickets.Description Like '%SEARCHTEXT%'
   OR tickets.TicketNumber Like '%SEARCHTEXT%'
   OR ticketAction.ActionDescription LIKE '%SEARCHTEXT%'

(Предполагается, что в каждом билете есть ticketAction. Если это не так, используйте LEFT JOIN)

Или EXISTS() ...

SELECT 
    tickets.TicketNumber, 
    tickets.Description,
    tickets.departmentname,
    tickets.devicename,
    tickets.creatorname,
    tickets.creationdate,
    tickets.ExecutionDate,
    tickets.closedate
    stateName,
    PriorityName,
    FullName,
FROM
           tickets
INNER Join Users      On Tickets.AssignedTo = Users.UserID
INNER Join States     On Tickets.StateID = States.StateID 
INNER Join Priorities On Tickets.priority = Priorities.PriorityID 
WHERE tickets.Description Like '%SEARCHTEXT%'
   OR tickets.TicketNumber Like '%SEARCHTEXT%'
   OR EXISTS (SELECT *
                FROM dbo.ticketaction
               WHERE ActionDescription like '%SEARCHTEXT%'
                 AND TicketNumber = tickets.TicketNumber
             )
0 голосов
/ 21 ноября 2018

Вы должны быть в состоянии сделать это с помощью простого объединения?Ниже приведен пример кода, но он может не соответствовать тому, что вы ищете.

Синтаксис объединения

SELECT tickets.TicketNumber
    ,tickets.Description
    ,tickets.departmentname
    ,tickets.devicename
    ,tickets.creatorname
    ,tickets.creationdate
    ,tickets.ExecutionDate
    ,tickets.closedate stateName
    ,PriorityName
    ,FullName
FROM tickets
INNER JOIN Users ON Tickets.AssignedTo = Users.UserID
INNER JOIN States ON Tickets.StateID = States.StateID
INNER JOIN Priorities ON Tickets.priority = Priorities.PriorityID
WHERE Description LIKE '%SEARCHTEXT%'
    OR TicketNumber LIKE '%SEARCHTEXT%'

UNION

SELECT t.TicketNumber
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
    ,NULL
FROM dbo.ticketaction t
WHERE ActionDescription LIKE '%SEARCHTEXT%'
...