当我运行这个SQL时,我得到116,463行。 从appsdisc.appsdisc_phones_gen_v
中选择*当我运行视图定义脚本中的选择时,我得到11,702行。
我无法弄清楚为什么结果集不同。
视图脚本如下。
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'));
答案 0 :(得分:0)
戈登是对的,选择应返回与视图相同的结果。诸如在不同模式,数据库或数据库链接中运行查询等问题可以解释您正在观察的内容。您可以通过在下面的同一数据库和模式中运行两个SQL命令并比较两者返回的值来看到这一点。
首先,使用SQL确认视图返回的行数:
SELECT COUNT(*) FROM APPSDISC.APPSDISC_PHONES_GEN_V;
然后使用SQL确认视图查询返回的行数:
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
/
两个查询都应返回相同的值。如果没有,则此问题比返回不同行数的查询更多。
答案 1 :(得分:0)
如果您正在完全按原样运行视图查询,并且您没有以APPSDISC
身份登录,那么您可能正在查询自己的表(或视图),因为appsdisc_phones_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
我没有在view语句中的select中指定架构,因此它将与视图所有者相同,在这种情况下为SOUSER1
。
然后作为第二个用户(SOUSER2
),我可以创建自己的表格版本,行数更少。查询视图仍会显示SOUSER1
表中的行数,而不是我自己的行数。
create table my_table (id number);
insert into my_table
select level as id from dual connect by level <= 100;
commit;
select count(*) from souser1.my_view;
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
,你没有在登录时设置你当前的架构,而你没有有一个同义词指向某个模式中的表。