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个表的主要内容,如果未能解决你的问题,请参考以下文章

Oracle查询使用空间比较大的前15个表

Oracle在2个表查询中只选择一个非重复项

Oracle_SQL 连接和子查询

oracle sql 列别名

Oracle 中的平均查询

Oracle 从主键列中选择返回空值?