oracle查询一次返回3个表
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle查询一次返回3个表相关的知识,希望对你有一定的参考价值。
Oracle查询是一种可以查询关系数据库的语言,它是一种声明式语言,可以用来检索、插入、更新和删除数据。以下是Oracle查询中常见的三个表:
1. USER_TABLES:这个表包含了当前用户下的所有表的信息,比如表名、表类型、表所有者等。
2. ALL_TABLES:这个表包含了所有用户下的所有表的信息,比如表名、表类型、表所有者等。
3. DBA_TABLES:这个表包含了数据库中所有表的信息,比如表名、表类型、表所有者等。
USER_TABLES表用于存储当前用户下的表信息,ALL_TABLES表用于存储所有用户下的表信息,而DBA_TABLES表用于存储数据库中所有表的信息。这三个表可以帮助用户更加有效地查询和管理数据库中的表。 参考技术A Oracle是一个用于管理数据库的关系型数据库管理系统,它可以帮助用户存储和管理数据。Oracle可以查询多个表,返回多个结果。返回3个表的查询可以使用Oracle的SELECT语句,该语句可以连接多个表,并从中获取所需的数据。例如,如果要从表A,表B和表C中检索数据,则可以使用以下SELECT语句:SELECT * FROM A, B, C;以上SELECT语句可以从3个表中获取所有数据。此外,可以使用WHERE子句来筛选出所需的数据,例如:SELECT * FROM A, B, C WHERE A.name='John';上述SELECT语句可以返回表A,表B和表C中name列为John的所有数据。 参考技术B Oracle查询一次返回3个表是通过内连接(Inner Join)实现的。内连接是SQL查询中最常用的连接类型,它用于从两个表中返回匹配的行。 Oracle表连接的一般形式如下:
SELECT 字段名称
FROM 表1 INNER JOIN 表2 ON 表1.字段名称=表2.字段名称
INNER JOIN 表3 ON表2.字段名称=表3.字段名称
WHERE 筛选条件;
上述SQL语句通过两次内连接,将三个表联系起来,返回满足筛选条件的结果。必须注意,内连接只返回两个表中匹配的行,在此查询中,只有当表1,表2和表3之间的所有关联字段的值都匹配才会返回结果。
此外,您也可以使用Oracle中的外连接(Outer Join)查询三个表中的记录,写法如下:
SELECT 字段名称
FROM 表1
LEFT JOIN 表2 ON 表1.字段名称=表2.字段名称
LEFT JOIN 表3 ON表2.字段名称=表3.字段名称
WHERE 筛选条件;
外连接可以返回两个表中不匹配的行,在这种情况下,查询结果中包含来自表1或表2或表3中的记录,但不含从这三个表中同时获取的匹配记录。
Oracle 从主键列中选择返回空值?
【中文标题】Oracle 从主键列中选择返回空值?【英文标题】:Oracle Select From primary key column return null value? 【发布时间】:2014-08-28 02:39:37 【问题描述】:我从查询中创建了一个视图。此查询从连接在一起的 2 个表中检索数据。其中之一使用主键进行内部连接。但是数据在主键上返回空结果。这里有什么问题?
CREATE TABLE orderinfo
(
orderid VARCHAR2 (20),
qtty NUMBER (20, 0),
price NUMBER (20, 0)
)
/
ALTER TABLE orderinfo ADD CONSTRAINT orderinfo_pk PRIMARY KEY (orderid)
/
INSERT INTO orderinfo (orderid, qtty, price)
VALUES ('OD00001', 1000, 15000);
INSERT INTO orderinfo (orderid, qtty, price)
VALUES ('OD00002', 2000, 15000);
INSERT INTO orderinfo (orderid, qtty, price)
VALUES ('OD00003', 3000, 15000);
INSERT INTO orderinfo (orderid, qtty, price)
VALUES ('OD00004', 4000, 15000);
COMMIT
/
create table ordersend
(
orderid varchar2(20),
orderstatus varchar2(3)
)
ALTER TABLE ordersend ADD CONSTRAINT ordersend_pk PRIMARY KEY (orderid)
/
INSERT INTO ordersend (orderid, status)
VALUES ('OD00001', 'N');
INSERT INTO ordersend (orderid, status)
VALUES ('OD00002', 'N');
INSERT INTO ordersend (orderid, status)
VALUES ('OD00003', 'N');
INSERT INTO ordersend (orderid, status)
VALUES ('OD00004', 'N');
COMMIT
/
CREATE VIEW vw_ordersendstatus
AS
SELECT "orderid",
"qtty",
"price",
"status"
FROM (SELECT inf.orderid,
inf.qtty,
inf.price,
send.status
FROM orderinfo inf, ordersend send
WHERE inf.orderid = send.orderid AND status = 'N')
/
CREATE TABLE orderblock
(
orderid VARCHAR2 (20),
qtty NUMBER (20, 0),
price NUMBER (20, 0)
)
/
CREATE PROCEDURE pr_sendorder
IS
CURSOR c_send
IS
SELECT orderid orderid,
qtty,
price,
status
FROM vw_ordersendstatus;
BEGIN
FOR i IN c_send
LOOP
INSERT INTO orderblock (orderid, qtty, price)
VALUES (i.orderid, i.qtty, i.price);
UPDATE ordersend
SET status = 'B'
WHERE orderid = i.orderid;
END LOOP;
EXCEPTION
WHEN OTHERS
THEN
RAISE '-1';
END;
然后 SELECT * FROM 订单块
在 orderid 字段上返回 null 值
为什么??? 请帮忙
【问题讨论】:
当子查询不使用这些标识符时,由于您在select
中使用了区分大小写的标识符,您的视图无法成功编译。您在ordersend
中的insert
语句失败,因为没有status
列。
【参考方案1】:
ordersend 的创建表不包含视图中提到的 STATUS 列。
在视图中,您使用了带引号的小写列名。引号强制 Oracle 将它们视为区分大小写。
如果您混淆了带引号和不带引号的列/变量名称,您可能会遇到这样的情况:不带引号的 orderid 的值来自大写的 ORDERID 或不带引号的 orderid,而不是您期望的带引号的小写“orderid”。最好避免为列、变量和表使用带引号的标识符。
没有完整的脚本,很难确定
【讨论】:
【参考方案2】:谢谢加里, 在我的问题中,我有一个错误的观点。 正确的是:
INSERT INTO ordersend (orderid, orderstatus)
VALUES ('OD00001', 'N');
INSERT INTO ordersend (orderid, orderstatus)
VALUES ('OD00002', 'N');
INSERT INTO ordersend (orderid, orderstatus)
VALUES ('OD00003', 'N');
INSERT INTO ordersend (orderid, orderstatus)
VALUES ('OD00004', 'N');
CREATE VIEW vw_ordersendstatus
AS
SELECT "ORDERID",
"QTTY",
"PRICE",
"STATUS"
FROM (SELECT inf.orderid,
inf.qtty,
inf.price,
send.orderstatus status
FROM orderinfo inf, ordersend send
WHERE inf.orderid = send.orderid AND orderstatus = 'N')
【讨论】:
以上是关于oracle查询一次返回3个表的主要内容,如果未能解决你的问题,请参考以下文章