Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用SQL或HQL连接父表和子表以获得以下内容_Sql_Hql - Fatal编程技术网

如何使用SQL或HQL连接父表和子表以获得以下内容

如何使用SQL或HQL连接父表和子表以获得以下内容,sql,hql,Sql,Hql,给定如下表1和表2,如何返回如下所示的结果集 表1 TBL1_PK TBL1_COL2 1 A 表2 TBL2_PK TABLE1_FK ROLE_CD FIRST_NAME LAST_NAME 1 1 ROLE_1 DEF GHI 2 1 ROLE_2 JKL MNP 3 1 ROLE_3 RST

给定如下表1和表2,如何返回如下所示的结果集

表1

TBL1_PK     TBL1_COL2
1            A  
表2

TBL2_PK  TABLE1_FK    ROLE_CD           FIRST_NAME  LAST_NAME
1      1           ROLE_1       DEF   GHI
2      1           ROLE_2       JKL   MNP
3      1           ROLE_3       RST   UVW
结果集

TBL1_COL2  ROLE_1_FIRST_NAME ROLE1_LAST_NAME ROLE_2_FIRST_NAME ROLE_2_LAST_NAME
A          DEF               GHI             JKL               MNP

您可以使用聚合来执行此操作:

select t1.TBL1_COL2,
    max(case 
            when t2.role_cd = 'ROLE_1'
                then t2.first_name
            end) ROLE_1_FIRST_NAME,
    max(case 
            when t2.role_cd = 'ROLE_1'
                then t2.last_name
            end) ROLE1_LAST_NAME,
    max(case 
            when t2.role_cd = 'ROLE_2'
                then t2.first_name
            end) ROLE_2_FIRST_NAME,
    max(case 
            when t2.role_cd = 'ROLE_2'
                then t2.last_name
            end) ROLE2_LAST_NAME
from table1 t1
join table2 t2 on t1.tbl1_pk = t2.table1_fk
group by t1.TBL1_COL2

使用两个不同的别名将表1连接到表2两次。然后根据需要限制别名,以从其中一个获取角色_1,从另一个获取角色_2

select
 T1.TBL1_COL2 as "TBL1_COL2",
 T2R1.FIRST_NAME as "Role_1_first_name",
 T2R1.Last_name as "Role_1_last_name",
 T2R2.First_name as "Role_2_first_name",
 T2R2.Last_name as "Role_2_last_name"
from 
   Table1 as T1
 inner join Table2 as T2R1 on T1.TBL1_PK = T2R1.Table1_fk
 inner join Table2 as T2R2 on T2.TBL1_PK = T2T2.Table1_fk
where
    T2R1.role_cd = "Role_1"
and T2T2.role_cd = "Role_2";

迈克的方法对我有效。谢谢大家。选择T1.TBL1_COL2为“TBL1_COL2”,T2R1.FIRST_NAME为“ROLE_1_FIRST_NAME”T2R1.LAST_NAME为“ROLE_1_LAST_NAME”,T2R2.FIRST_NAME为“ROLE_2_FIRST_NAME”,T2R2.LAST_NAME为“ROLE_2_LAST_NAME”从表1作为T1内部联接表2作为T1.TBL1上的T2R1\u PK=T2R1.Table1\u FK内部联接表2作为T1.TBL1\u PK=t2t2t2.Table1\u FK上的T2R2,其中T2R1.role\u cd='role\u 1'和T2R2.role\u cd='role\u 2',这是一种低效的方法。第二个表读两遍。你不需要读两遍,效率取决于很多事情。任何优化器都只从磁盘读取表一次。如果整个表都缓存在内存中,则可能根本没有磁盘读取。在这之后,问题变成了4个case语句和一个聚合是否比额外的主键查找和2个相等性比较快。我敢打赌,和往常一样,答案是“视情况而定”。如果这是一个时间和CPU都很重要的任务关键型查询,那么我建议对两者进行测试。如果不是,我建议运行更容易理解和维护的。哦,记住,对于聚合,在整个查询完成并保存在内存中之前,不会返回任何行。这将导致第一次记录响应时间变慢。这也意味着结果表和2个输入表都需要在内存中。上面的方法可以在生成结果时将结果泄漏回客户端。网络传输速率可能仍然意味着整个输出表都在内存中,但如果将其用作可以立即并行使用行的子查询,则上述操作的性能可能会更好。