2013-12-20 5 views
0

Может ли кто-нибудь показать мне, как вложить эти запросы в один полный запрос? Прямо сейчас, я просто запускаю каждый из них (до 10) по одному, но я хочу научиться запускать этот запрос одним выстрелом.Как вложить несколько SQL-запросов?

Dim queryString1 As String = 
"SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
FROM dbo.APE_BUSDRIVER_MAIN 
WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " 
AND ACTIVE = 1 
GROUP BY EMPLOYEE_NAME ORDER BY YIELD " & lblSortOrder.Text & "" 


Dim queryString2 As String = 
"SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
FROM dbo.APE_BUSDRIVER_MAIN 
WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " 
AND ACTIVE = 1 
AND EMPLOYEE_NAME <> '" & LblStckRnk1.Text & "' 
GROUP BY EMPLOYEE_NAME 
ORDER BY YIELD " & lblSortOrder.Text & "" 


Dim queryString3 As String = 
"SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
FROM dbo.APE_BUSDRIVER_MAIN 
WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " 
AND ACTIVE = 1 
AND EMPLOYEE_NAME <> '" & LblStckRnk1.Text & "' 
AND EMPLOYEE_NAME <> '" & LblStckRnk2.Text & "' 
GROUP BY EMPLOYEE_NAME 
ORDER BY YIELD " & lblSortOrder.Text & "" 

ответ

1

Я хотел бы использовать несколько заявлений UNION:

Dim queryString1 As String = "SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
    FROM dbo.APE_BUSDRIVER_MAIN WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " AND ACTIVE = 1 
    GROUP BY EMPLOYEE_NAME ORDER BY YIELD " & lblSortOrder.Text & vbCrLf & _ 

" UNION " & vbCrLf & _ 

"SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
    FROM dbo.APE_BUSDRIVER_MAIN 
    WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " AND ACTIVE = 1 
    AND EMPLOYEE_NAME <> '" & LblStckRnk1.Text & "' 
    GROUP BY EMPLOYEE_NAME ORDER BY YIELD " & lblSortOrder.Text & vbCrLf & _ 

" UNION " & vbCrLf & _ 

"SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
    FROM dbo.APE_BUSDRIVER_MAIN 
    WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " AND ACTIVE = 1 
    AND EMPLOYEE_NAME <> '" & LblStckRnk1.Text & "' AND EMPLOYEE_NAME <> '" & LblStckRnk2.Text & "' 
    GROUP BY EMPLOYEE_NAME ORDER BY YIELD " & lblSortOrder.Text 

(конечно, вы хотите, чтобы удалить лишние разрывы строк, которые я добавил для удобства чтения)

+0

нормально прохладное. Я попробую. Благодаря! –

+0

Вопрос: Как я могу указать идентификатор элемента второго запроса объединения? Я думал, что если бы я использовал CType (Reader.Item (2), String), я мог бы получить второго сотрудника, но im получал бы «Index был за пределами массива». error –

+0

ItemID не является частью набора результатов. Вам нужно будет добавить его к каждому из трех запросов. Имейте в виду, что Reader.Item (2) относится к третьему элементу в инструкции SELECT (и вы указали только два элемента). – tgolisch

1

Давайте посмотрим, что это запросы возвращаются:

(все три использует ту же группу, и в том же порядке)

1- Возвращает все «активные» сотрудники на «areaFooBar»

2- возвращает все «активные» сотрудники на «areaFooBar» МИНУС один сотрудник

3- возвращает все «активные» сотрудников на «areaFooBar «MINUS two employee

Вы можете сделать такую ​​фильтрацию в коде. Вам не нужно запускать запрос 2 или запрос 3. Повторно повторите набор результатов запроса 1 и отфильтруйте сотрудника, которого вы не хотите включать.

Вы можете прочитать его из базы данных каждый раз, то вы можете использовать одну строку запроса, если вы добавить еще один параметр для вашего запроса .: т.е. разделенный запятыми-list.Text

Dim queryString1 As String = 
" 
SELECT EMPLOYEE_NAME, AVG(EFFICIENCY_YIELD) AS YIELD 
FROM dbo.APE_BUSDRIVER_MAIN 
WHERE APE_AREA_OBJID = " & lblAreaOBJID.Text & " 
AND ACTIVE = 1 
EMPLOYEE_NAME NOT IN (" & comma-separated-list.Text & ") 
GROUP BY EMPLOYEE_NAME ORDER BY YIELD " & lblSortOrder.Text & "" 
+0

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

+0

Объявите переменную varchar как список, разделенный запятой. Вы можете заполнить эту переменную (список с запятыми) с помощью значений «LblStckRnkX.Text». i.e: Если вы не будете включать текст LblStckRnk, установите для разделенного запятыми список в пустую строку. Если вы пройдете LblStckRnk1.Text и LblStckRnk2.Text и LblStckRnk3.Text; затем установите запятую-отправленный список в [LblStckRnk1.Text + "," + LblStckRnk2.Text + "," LblStckRnk3.Text]. –

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