如何解决如何基于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
,
我认为这里的要点是您要将复杂的查询结果与另一个表联接吗?您可以通过以下方式实现它:
- 使用
WITH tbl AS (.....)
,然后在tbl
上联接另一个表(查询结果)。 - 为您的第一个结果创建一个
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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。