简体   繁体   English

从不直接相关的表的子查询中合并SQL中的列

[英]Combine Columns in SQL from Sub Queries on Tables that are not Directly Correlated

I have 4 Subqueries that I need to run as a unit and retrieve the distinct results in 1 list. 我有4个子查询,它们需要作为一个单元运行并在1个列表中检索不同的结果。 My java application will call this query with Spring Data JPA repository and it should return a List. 我的Java应用程序将使用Spring Data JPA存储库调用此查询,并且它应返回一个List。

## 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));

The columns S_NAME, I_NAME, C_NAME, and P_NAME contain the same data. 列S_NAME,I_NAME,C_NAME和P_NAME包含相同的数据。 Simply different names so we know the source of that data. 只是名称不同,因此我们知道该数据的来源。 However, for this query I need distinct results from all these columns in 1 column. 但是,对于此查询,我需要1列中所有这些列的不同结果。

Can this be done easily without making a stored procedure? 无需执行存储过程就可以轻松完成此操作吗? I would, but I don't have the authorization for such things. 可以,但是我没有获得此类授权。 Same constaint on making a view. 同样的观点。

You can use union all to get the value in rows or put them in separate columns. 您可以使用union all来获取行中的值或将其放在单独的列中。 Here is one way: 这是一种方法:

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;

Although the queries are similar, I am not sure if it is worth trying to combine them. 尽管查询相似,但我不确定是否值得尝试将它们组合在一起。

Use UNION , which implies DISTINCT so you don't need to say that: 使用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: The third query is double-reading C_TABLE , which is a waste. 仅供参考:第三个查询是重复读取C_TABLE ,这很浪费。 I left it alone, assuming it's a simple mistake setting up the example. 假设设置示例是一个简单的错误,我就不理会它了。

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));

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM