Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle SQL-从视图中选择比在视图中运行select更多的行_Sql_Oracle_Views - Fatal编程技术网

Oracle SQL-从视图中选择比在视图中运行select更多的行

Oracle SQL-从视图中选择比在视图中运行select更多的行,sql,oracle,views,Sql,Oracle,Views,当我运行这个SQL时,我得到116463行。 从appsdisc.appsdisc\u phones\u gen\u v中选择* 当我运行视图定义脚本中的select时,我得到11702行 我不明白为什么结果集是不同的 视图脚本如下所示 CREATE OR REPLACE FORCE VIEW APPSDISC.APPSDISC_PHONES_GEN_V (PARTY_ID, CUSTOMER_ID, CUSTOMER_NUMBER, PHONE_NUMBER, PHONE_TYPE) AS

当我运行这个SQL时,我得到116463行。 从appsdisc.appsdisc\u phones\u gen\u v中选择*

当我运行视图定义脚本中的select时,我得到11702行

我不明白为什么结果集是不同的

视图脚本如下所示

CREATE OR REPLACE FORCE VIEW APPSDISC.APPSDISC_PHONES_GEN_V
(PARTY_ID, CUSTOMER_ID, CUSTOMER_NUMBER, PHONE_NUMBER, PHONE_TYPE)
AS 
SELECT party_id,
          customer_id,
          customer_number,
          phone_number,
          phone_type
     FROM appsdisc_phones_v pv1
    WHERE pv1.phone_type LIKE
             DECODE (TRIM (SUBSTR (pv1.attribute14, 1, 4)),
                     'FR', 'FR T%',
                     'PHONE')  
          AND pv1.contact_point_id =
                 (SELECT MIN (pv2.contact_point_id)
                    FROM appsdisc_phones_v pv2
                   WHERE pv2.customer_id = pv1.customer_id
                         AND pv2.phone_type LIKE
                                DECODE (
                                   TRIM (SUBSTR (pv1.attribute14, 1, 4)),
                                   'FR', 'FR T%',
                                   'PHONE'));

Gordon是对的,select应该返回与视图相同的结果。在不同的模式、数据库或数据库链接上运行查询等问题可以解释您所观察到的情况。您可以通过在下面相同的数据库和模式中运行两个SQL命令并比较两者返回的值来看到这一点

首先,确认视图使用SQL返回的行数:

SELECT COUNT(*) FROM APPSDISC.APPSDISC_PHONES_GEN_V;
WITH RESULTS AS (
     SELECT party_id,
          customer_id,
          customer_number,
          phone_number,
          phone_type
     FROM appsdisc_phones_v pv1
    WHERE pv1.phone_type LIKE
             DECODE (TRIM (SUBSTR (pv1.attribute14, 1, 4)),
                     'FR', 'FR T%',
                     'PHONE')  
          AND pv1.contact_point_id =
                 (SELECT MIN (pv2.contact_point_id)
                    FROM appsdisc_phones_v pv2
                   WHERE pv2.customer_id = pv1.customer_id
                         AND pv2.phone_type LIKE
                                DECODE (
                                   TRIM (SUBSTR (pv1.attribute14, 1, 4)),
                                   'FR', 'FR T%',
                                   'PHONE')))
SELECT COUNT(*)
FROM RESULTS
/
然后使用SQL确认视图查询返回的行数:

SELECT COUNT(*) FROM APPSDISC.APPSDISC_PHONES_GEN_V;
WITH RESULTS AS (
     SELECT party_id,
          customer_id,
          customer_number,
          phone_number,
          phone_type
     FROM appsdisc_phones_v pv1
    WHERE pv1.phone_type LIKE
             DECODE (TRIM (SUBSTR (pv1.attribute14, 1, 4)),
                     'FR', 'FR T%',
                     'PHONE')  
          AND pv1.contact_point_id =
                 (SELECT MIN (pv2.contact_point_id)
                    FROM appsdisc_phones_v pv2
                   WHERE pv2.customer_id = pv1.customer_id
                         AND pv2.phone_type LIKE
                                DECODE (
                                   TRIM (SUBSTR (pv1.attribute14, 1, 4)),
                                   'FR', 'FR T%',
                                   'PHONE')))
SELECT COUNT(*)
FROM RESULTS
/

两个查询应返回相同的值。如果没有,那么这个问题不仅仅是返回不同行数的查询。

如果您完全按照原样运行视图查询,并且您没有以
APPSDISC
的身份登录,那么您可能正在查询自己的表(或视图),因为视图脚本中的模式没有前缀
APPSDISC\u v
。希望这是一个开发环境,您有一个旧的副本是有充分理由的

这是我想你看到的效果的演示。作为一个用户(
SOUSER1
),我可以创建并填充一个表,表上有一个视图,并将该视图的访问权授予其他用户。注意,我不需要直接授予对基础表的访问权

create table my_table (id number);

insert into my_table
select level as id from dual connect by level <= 1000;

commit;

create view souser1.my_view as select * from my_table;

grant select on souser1.my_view to souser2;

select count(*) from my_view;

  COUNT(*)
----------
      1000 

select count(*) from my_table;

  COUNT(*)
----------
      1000 
如果从原始视图运行查询,我会看到我自己的表副本,它会更小,因为表名不符合模式名-因此它默认为我自己的:

select count(*) from my_table;

  COUNT(*)
----------
       100 
因此,只要表有两个版本,并且您没有指定要查询的行数,那么查看不同的行数是有意义的

在我的例子中,如果我试图直接查询另一个模式的表,我会得到一个错误,因为我没有授予该表任何特权:

select count(*) from souser1.my_table;

SQL Error: ORA-00942: table or view does not exist
00942. 00000 -  "table or view does not exist"

但是查询
my_table
时会看到相同的错误,如果您没有自己的副本,登录时没有设置当前架构,并且在某些架构中没有指向表的同义词。

运行相同的select应该会得到相同的结果,假设您连接到相同的数据库并且数据没有更改。您是否可以编辑问题以显示用于计算结果集的代码?您是以
APPSDISC
用户的身份运行独立查询,还是在另一个名为
APPSDISC\u v
的模式中运行独立查询?