如何基于SQL中的某些条件联接两个表?

问题描述

我需要帮助来连接两个表以获取输出。我告诉你情况。你能帮我吗?

示例:

我有一个SQL查询查询

SELECT * 
FROM (
  SELECT schemaname,objectname,usename,HAS_TABLE_PRIVILEGE(usrs.usename,fullobj,'select') AND has_schema_privilege(usrs.usename,schemaname,'usage')  AS sel,'insert') AND has_schema_privilege(usrs.usename,'usage')  AS ins,'update') AND has_schema_privilege(usrs.usename,'usage')  AS upd,'delete') AND has_schema_privilege(usrs.usename,'usage')  AS del,'references') AND has_schema_privilege(usrs.usename,'usage')  AS ref 
  FROM (
     SELECT schemaname,'t' AS obj_type,tablename AS objectname,schemaname + '.' + tablename AS fullobj 
     FROM pg_tables 
     WHERE schemaname not in ('pg_internal') 
     UNION 
     SELECT schemaname,'v' AS obj_type,viewname AS objectname,schemaname + '.' + viewname AS fullobj 
     FROM pg_views 
     WHERE schemaname not in ('pg_internal')
  ) AS objs,(SELECT * FROM pg_user) AS usrs ORDER BY fullobj
) 
WHERE (sel = true or ins = true or upd = true or del = true or ref = true) 
   and schemaname='medaff' 
   and usename not in ('rdsdb','clustersa','prdrscl01master') 
   and objectname in RES;

上面的查询给出了一些输出

Table 1

schemaname  objectname   usename           sel  ins  upd  del  ref
medaff      dmn_category medaff_dev_admin  True True True True True
medaff      dmn_category emea_dev_admin    True True True True True
medaff      dmn_category cdeadmin          True True True True True

我还有另一个有一些记录的表:

Table 2:

application_name  tablename
smart_source      dmn_category

如何将这两个表结合在一起,以在最终输出获取应用程序名称

application_name schemaname  objectname   usename           sel  ins  upd  del  ref  
smart_source     medaff      dmn_category medaff_dev_admin  True True True True True
smart_source     medaff      dmn_category emea_dev_admin    True True True True True
smart_source     medaff      dmn_category cdeadmin          True True True True True

解决方法

当您要表示2个表时,可以使用inner join on,但是为此,您需要在每个表中都有一些共同点。 例如:

select t.name,o.code from FirstTable t inner join OtherTable o on t.code = o.code
,

我认为这里的要点是您要将复杂的查询结果与另一个表联接吗?您可以通过以下方式实现它:

  1. 使用WITH tbl AS (.....),然后在tbl上联接另一个表(查询结果)。
  2. 为您的第一个结果创建一个VIEW,然后将该视图与另一个表连接起来。
,

您的查询看起来不错。 UNION应该是UNION ALL,并且

) AS objs,(SELECT * FROM pg_user) AS usrs

应该是

) AS objs
CROSS JOIN pg_user AS usrs

ORDER BY fullobj

是多余的,因为允许DBMS忽略子查询内部的ORDER BY。 (如果要对结果进行排序,请将ORDER BY fullobj放在查询的末尾。)

但是无论如何,您似乎只想加入table2:

) AS objs
CROSS JOIN pg_user AS usrs
INNER JOIN table2 ON table2.tablename = objs.objectname

完整查询:

SELECT * FROM 
(
  SELECT
    table2.application_name,objs.schemaname,objs.objectname,usrs.usename,HAS_TABLE_PRIVILEGE(usrs.usename,objs.fullobj,'select') AND has_schema_privilege(usrs.usename,'usage') AS sel,'insert') AND has_schema_privilege(usrs.usename,'usage') AS ins,'update') AND has_schema_privilege(usrs.usename,'usage')  AS upd,'delete') AND has_schema_privilege(usrs.usename,'usage')  AS del,'references') AND has_schema_privilege(usrs.usename,'usage') AS ref
  FROM
  (
    SELECT 
      schemaname,'t' AS obj_type,tablename AS objectname,schemaname + '.' + tablename AS fullobj
    FROM pg_tables 
    WHERE schemaname not in ('pg_internal') 
    UNION ALL
    SELECT 
      schemaname,'v' AS obj_type,viewname AS objectname,schemaname + '.' + viewname AS fullobj 
    FROM pg_views 
    WHERE schemaname not in ('pg_internal')
  ) AS objs
  CROSS JOIN pg_user AS usrs
  INNER JOIN table2 ON table2.tablename = objs.objectname
)
WHERE (sel = true or ins = true or upd = true or del = true or ref = true)
  and schemaname = 'medaff' 
  and usename not in ('rdsdb','clustersa','prdrscl01master')
ORDER BY schemaname,objectname,application_name,usename;