Oracle case语句中的外部联接

Oracle case语句中的外部联接,oracle,outer-join,Oracle,Outer Join,我有以下疑问: SELECT U.NAME , U.TYPE , U.REFERENCED_NAME , U.REFERENCED_TYPE, CASE WHEN U.REFERENCED_TYPE= 'TABLE' and A.TABLE_NAME= U.REFERENCED_NAME THEN 'TABLE EXISTS' WHEN U.REFERENCED_TYPE= 'PROCEDURE' and A.TABLE_NAME= U.REFERENCED_NAME THEN

我有以下疑问:

SELECT U.NAME , U.TYPE , U.REFERENCED_NAME , U.REFERENCED_TYPE,
CASE 
WHEN U.REFERENCED_TYPE= 'TABLE' and A.TABLE_NAME= U.REFERENCED_NAME 
  THEN 'TABLE EXISTS'
WHEN U.REFERENCED_TYPE= 'PROCEDURE' and A.TABLE_NAME= U.REFERENCED_NAME 
   THEN 'PROCEDURE EXISTS'
END
FROM  USER_DEPENDENCIES U , user_tables a  
WHERE U.name ='RANDOM_PROCEDURE_NAME' and U.REFERENCED_NAME = A.TABLE_NAME;

我在这个查询中遇到的问题是:U.REFERENCED_NAME=A.TABLE_NAME这样的连接只给了我特定的条件。我想在TABLE USER_DEPENDENCIES中知道存在的表,即使它不存在于TABLE USER_tables A中。我想包括一个外部连接,但我不能这样做。有人能帮我吗?

像这样的吗?

SELECT
      U.NAME,
      U.TYPE,
      U.REFERENCED_NAME,
      U.REFERENCED_TYPE,
      CASE
          WHEN U.REFERENCED_TYPE = 'TABLE'
              AND A.TABLE_NAME = U.REFERENCED_NAME
          THEN
              'TABLE EXISTS'
          WHEN U.REFERENCED_TYPE = 'PROCEDURE'
              AND A.TABLE_NAME = U.REFERENCED_NAME
          THEN
              'PROCEDURE EXISTS'
          ELSE
              'NOT DEFINED'
      END
          TYPE_1
FROM
      USER_DEPENDENCIES U,
      USER_TABLES A
WHERE
      U.NAME LIKE '%TEST%'
      AND U.REFERENCED_NAME = A.TABLE_NAME(+)

像这样的吗?

SELECT
      U.NAME,
      U.TYPE,
      U.REFERENCED_NAME,
      U.REFERENCED_TYPE,
      CASE
          WHEN U.REFERENCED_TYPE = 'TABLE'
              AND A.TABLE_NAME = U.REFERENCED_NAME
          THEN
              'TABLE EXISTS'
          WHEN U.REFERENCED_TYPE = 'PROCEDURE'
              AND A.TABLE_NAME = U.REFERENCED_NAME
          THEN
              'PROCEDURE EXISTS'
          ELSE
              'NOT DEFINED'
      END
          TYPE_1
FROM
      USER_DEPENDENCIES U,
      USER_TABLES A
WHERE
      U.NAME LIKE '%TEST%'
      AND U.REFERENCED_NAME = A.TABLE_NAME(+)

使用
外部联接

FROM  
    USER_DEPENDENCIES u 
  LEFT OUTER JOIN
    user_tables a  
      ON u.REFERENCED_NAME = a.TABLE_NAME
WHERE 
    u.name ='RANDOM_PROCEDURE_NAME'  ; 

(左)表
USER\u DEPENDENCIES
中的所有行,无论它们在
USER\u表中是否有匹配的行。

使用
外部联接

FROM  
    USER_DEPENDENCIES u 
  LEFT OUTER JOIN
    user_tables a  
      ON u.REFERENCED_NAME = a.TABLE_NAME
WHERE 
    u.name ='RANDOM_PROCEDURE_NAME'  ; 

(左)表
USER\u DEPENDENCIES
中的所有行,无论它们在
USER\u表中是否有匹配的行。

这将提供对对象的所有依赖关系。对于表和过程,它显示了数据库架构中存在的表和过程:

select dep.name , dep.type , dep.referenced_name , dep.referenced_type,
case 
  when dep.referenced_type = 'TABLE' and tab.table_name is not null then
    'TABLE EXISTS'
  when dep.referenced_type = 'PROCEDURE' and pro.procedure_name is not null then
    'PROCEDURE EXISTS'
end as lookup
from user_dependencies dep
left outer join user_tables tab on (dep.referenced_type = 'TABLE' and tab.table_name = dep.referenced_name) 
left outer join user_procedures pro on (dep.referenced_type = 'PROCEDURE' and pro.procedure_name = dep.referenced_name) 
where dep.name ='RANDOM_PROCEDURE_NAME';

这将提供对对象的所有依赖关系。对于表和过程,它显示了数据库架构中存在的表和过程:

select dep.name , dep.type , dep.referenced_name , dep.referenced_type,
case 
  when dep.referenced_type = 'TABLE' and tab.table_name is not null then
    'TABLE EXISTS'
  when dep.referenced_type = 'PROCEDURE' and pro.procedure_name is not null then
    'PROCEDURE EXISTS'
end as lookup
from user_dependencies dep
left outer join user_tables tab on (dep.referenced_type = 'TABLE' and tab.table_name = dep.referenced_name) 
left outer join user_procedures pro on (dep.referenced_type = 'PROCEDURE' and pro.procedure_name = dep.referenced_name) 
where dep.name ='RANDOM_PROCEDURE_NAME';

请使用
左外联接
而不是
内联接
。将查询中的
替换为
,如下所示:

SELECT U.NAME , U.TYPE , U.REFERENCED_NAME , U.REFERENCED_TYPE,
CASE 
WHEN U.REFERENCED_TYPE= 'TABLE' and A.TABLE_NAME= U.REFERENCED_NAME 
  THEN 'TABLE EXISTS'
WHEN U.REFERENCED_TYPE= 'PROCEDURE' and A.TABLE_NAME= U.REFERENCED_NAME 
   THEN 'PROCEDURE EXISTS'
END
FROM  USER_DEPENDENCIES U 
LEFT JOIN user_tables a  
ON U.name ='RANDOM_PROCEDURE_NAME' and U.REFERENCED_NAME = A.TABLE_NAME;

希望这对你有帮助。谢谢。:)

请使用
左外连接
而不是
内连接
。将查询中的
替换为
,如下所示:

SELECT U.NAME , U.TYPE , U.REFERENCED_NAME , U.REFERENCED_TYPE,
CASE 
WHEN U.REFERENCED_TYPE= 'TABLE' and A.TABLE_NAME= U.REFERENCED_NAME 
  THEN 'TABLE EXISTS'
WHEN U.REFERENCED_TYPE= 'PROCEDURE' and A.TABLE_NAME= U.REFERENCED_NAME 
   THEN 'PROCEDURE EXISTS'
END
FROM  USER_DEPENDENCIES U 
LEFT JOIN user_tables a  
ON U.name ='RANDOM_PROCEDURE_NAME' and U.REFERENCED_NAME = A.TABLE_NAME;

希望这对你有帮助。谢谢。:)

你说的是左外联接吗?那么你想要所有的用户依赖项(引用表、过程、触发器等等)?对于那些引用表或过程的用户,您想知道user_表中是否存在与引用的表或过程同名的表?您正在寻找与所有_表中的表同名的过程?请澄清。你是说左外联接吗?那么你想要所有的用户依赖项(引用表、过程、触发器等等)?对于那些引用表或过程的用户,您想知道user_表中是否存在与引用的表或过程同名的表?您正在寻找与所有_表中的表同名的过程?请澄清。@Moudiz更新查询。。。现在查看RealSpirituals请给我一份文档,或者你可以向我解释我们什么时候使用(+)或(-)?没有(-)只有(+)阅读:这里面有更多链接外部联接的
(+)
语法很旧并且有限制。Oracle本身建议使用
JOIN
语法。请参阅@ypercube refere my commented link.@Moudiz更新查询。。。现在查看RealSpirituals请给我一份文档,或者你可以向我解释我们什么时候使用(+)或(-)?没有(-)只有(+)阅读:这里面有更多链接外部联接的
(+)
语法很旧并且有限制。Oracle本身建议使用
JOIN
语法。请参阅@ypercube引用我的评论链接。此查询对我更有效:)此查询对我更有效:)这对jerry thanx you很有帮助jerry thanx you很有帮助