2017-02-03 8 views
0

У меня есть 4 подзапроса, которые мне нужно запустить как единицу и получить отдельные результаты в 1 списке. Приложение java вызовет этот запрос с помощью репозитория Spring Data JPA, и он должен вернуть список.Объединить столбцы в SQL из подпроцессов на таблицах, которые не связаны напрямую.

## S_NAME based on TABLE_1.Id = 1 
SELECT DISTINCT(S_NAME) FROM TABLE_1 WHERE S_ID = 1; 

## I_NAME based on TABLE_1.Id = 1 
SELECT DISTINCT(I_NAME) FROM I_TABLE WHERE I_ID 
IN (SELECT I_ID FROM E_TABLE WHERE S_ID = 1); 

## C_NAME based on TABLE_1.Id = 1 
SELECT DISTINCT(C_NAME) FROM C_TABLE WHERE C_ID 
IN (SELECT C_ID FROM C_TABLE WHERE E_ID 
IN (SELECT E_ID FROM E_TABLE WHERE S_ID = 1)); 

## P_NAME based on TABLE_1.Id = 1 
SELECT DISTINCT(P_NAME) FROM P_TABLE WHERE C_ID 
IN (SELECT C_ID FROM C_TABLE WHERE E_ID 
IN (SELECT E_ID FROM E_TABLE WHERE S_ID = 1)); 

столбцы s_name, I_NAME, C_NAME и p_name содержат одни и те же данные. Просто разные имена, поэтому мы знаем источник этих данных. Однако для этого запроса мне нужны разные результаты из всех этих столбцов в 1 столбце.

Можно ли это сделать без внесения хранимой процедуры? Я бы, но у меня нет разрешения на такие вещи. То же самое, что и для просмотра.

ответ

0

Использование UNION, что подразумевает DISTINCT так что вам не нужно говорить, что:

SELECT S_NAME FROM TABLE_1 WHERE S_ID = 1 
UNION 
SELECT I_NAME FROM I_TABLE WHERE I_ID IN (
    SELECT I_ID FROM E_TABLE WHERE S_ID = 1) 
UNION 
SELECT C_NAME FROM C_TABLE WHERE C_ID IN (
    SELECT C_ID FROM C_TABLE WHERE E_ID IN (
     SELECT E_ID FROM E_TABLE WHERE S_ID = 1)) 
UNION 
SELECT P_NAME FROM P_TABLE WHERE C_ID IN (
    SELECT C_ID FROM C_TABLE WHERE E_ID IN (
     SELECT E_ID FROM E_TABLE WHERE S_ID = 1)) 
; 

FYI: Третий запрос дважды чтение C_TABLE, который представляет собой отходы. Я оставил его в покое, полагая, что это простая ошибка, создающая пример.

+0

Спасибо, сэр! Вы ответили, что отлично справились с моей проблемой. – jDub9

0

Вы можете использовать union all, чтобы получить значение в строках или поместить их в отдельные столбцы. Вот один из способов:

SELECT (SELECT DISTINCT(S_NAME) FROM TABLE_1 WHERE S_ID = 1 
     ) as val1, 
     (SELECT DISTINCT(I_NAME) FROM I_TABLE WHERE I_ID IN (SELECT I_ID FROM E_TABLE WHERE S_ID = 1 
     ) as val2, 
     (SELECT DISTINCT(C_NAME) FROM C_TABLE 
     WHERE C_ID IN (SELECT C_ID FROM C_TABLE WHERE E_ID IN (SELECT E_ID FROM E_TABLE WHERE S_ID = 1)) 
     ) as val3, 
     (SELECT DISTINCT(P_NAME) FROM P_TABLE 
     WHERE C_ID IN (SELECT C_ID FROM C_TABLE WHERE E_ID IN (SELECT E_ID FROM E_TABLE WHERE S_ID = 1)) 
     ) as val4; 

Хотя запросы похожи, я не уверен, стоит ли их комбинировать.

0
SELECT (S_NAME) FROM TABLE_1 WHERE S_ID = 1; 

UNION 
SELECT (I_NAME) FROM I_TABLE WHERE I_ID 
IN (SELECT I_ID FROM E_TABLE WHERE S_ID = 1); 

UNION 
SELECT (C_NAME) FROM C_TABLE WHERE C_ID 
IN (SELECT C_ID FROM C_TABLE WHERE E_ID 
IN (SELECT E_ID FROM E_TABLE WHERE S_ID = 1)); 
-- HERE UNION will only Take DISTINCT row from the each query no need of Distinct 
UNION 
SELECT (P_NAME) FROM P_TABLE WHERE C_ID 
IN (SELECT C_ID FROM C_TABLE WHERE E_ID 
IN (SELECT E_ID FROM E_TABLE WHERE S_ID = 1));