2012-04-23 2 views
-3

Привет Я пытаюсь получить результаты для каждого из следующих запросов в один запрос. Я знаю, что могу сделать объединение, но мне было интересно, есть ли лучший способ, потому что у каждой таблицы разные столбцы? БлагодаряНужна помощь при написании запроса

select distinct RESOURCE_ID from USER_ROLES where TEST_IND ='Y' 

select distinct RESOURCE_ID from USER_PLATFORMS where TEST_IND ='Y' 

select distinct RESOURCE_ID from USER_COMPETENCIES where TEST_IND ='Y' 

select distinct RESOURCE_ID from USER_TECH_SKILLS where TEST_IND ='Y' 

select distinct RESOURCE_ID from USER_MGR_SKILLS where TEST_IND ='Y' 

select distinct RESOURCE_ID from USER_APPS where TEST_IND ='Y' 

select distinct RESOURCE_ID from BUS_PROCS where TEST_IND ='Y' 
+0

Что вы хотите, чтобы результат выглядел? Невозможно написать запрос, где каждая строка имеет разные столбцы. – JohnFx

+1

Я думаю, что UNION - лучший способ пойти .... –

+0

И вы ищете одну строку со многими столбцами (RoleId, PlatformId, ...) или много строк с одним столбцом? – pilotcam

ответ

1

Хотя вы говорите, вы не хотите запроса UNION, ничего в ваших требованиях, как описано в комментариях исключает его. Это нормально, если таблицы имеют разные столбцы, если выбранные столбцы одинаковы во всех таблицах.

Это то, что вам нужно

select RESOURCE_ID from USER_ROLES where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_PLATFORMS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_COMPETENCIES where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_TECH_SKILLS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_MGR_SKILLS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_APPS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from BUS_PROCS where TEST_IND ='Y' 

Примечание: Я вынула различные положения, союз сделает результат отчетливый в любом случае, так что это лишнее.

1

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

select RESOURCE_ID from USER_ROLES where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_PLATFORMS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_COMPETENCIES where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_TECH_SKILLS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_MGR_SKILLS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from USER_APPS where TEST_IND ='Y' 
UNION 
select RESOURCE_ID from BUS_PROCS where TEST_IND ='Y' 

UNION MSDN

+0

Как говорит JohnFx, DISTINCT не нужны. Dupes автоматически отбрасываются в этом сценарии, если автор не использует UNION ALL. – DaveE

+0

Правильно, я даже сказал это. Просто забыли удалить их .. Готово сейчас .. – TheRealTy

-1

Кроме профсоюзов уже упоминалось, вы могли бы использовать табличное значение функции мульти-заявление: определить переменную таблицы и SELECT INTO от вашего множества запросов, а затем выберите * из FunctionName (). Тем не менее, вам все равно нужен каждый запрос для создания одних и тех же столбцов с одинаковыми типами данных, поэтому вам может понадобиться отбрасывать или конвертировать круглые колышки в квадратные столбчатые отверстия.

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