通过从三个表中提取数据来创建视图

时间:2017-02-27 09:10:42

标签: sql oracle view

我知道这些问题已被多次询问,但它没有解决我的问题。

我有三个表,JD,LYR和VC,这三个表都有不同的模式。我想创建一个视图,从这三个表中提取数据,这样,它将具有JD和LYR以及LYR和VC中的记录。所以,我认为JD / LYR和LYR / VC之间应该有内连接。我不想加入JD和VC。

我编写了sql,但是,如果它显示JD和LYR中存在的记录,那么它将不会显示LYR和VC之间的匹配记录,反之亦然。我目前的SQL如下所示。

CREATE OR REPLACE VIEW TEST_VIEW AS
SELECT JD.REQ_ID,
       JD.REF_NO,
       LYR.OID_VAL,
       VC.ACCOUNT_STATUS,
       VC.ACCOUNT_NUMBER
FROM JD 
INNER JOIN LYR
    ON (JD.REQ_ID = LYR.REQ_ID)
INNER JOIN VC
    ON LYR.REQ_ID = VC.REQUEST_ID;

我尝试将连接类型更改为其他连接,例如Left outer等,但是没有用。对于此视图的SQL,我们将不胜感激。

提前致谢, KB。

5 个答案:

答案 0 :(得分:0)

尝试下面的事情:

CREATE OR REPLACE VIEW TEST_VIEW AS
SELECT * FROM (SELECT JD.REQ_ID,JD.REF_NO,LYR.OID_VAL,VCASE.ACCOUNT_STATUS,VCASE.ACCOUNT_NUMBER 
FROM JD INNER JOIN LYR ON (JD.REQ_ID = LYR.REQ_ID)) a INNER JOIN VC
ON a.REQ_ID = VC.REQUEST_ID;

答案 1 :(得分:0)

尝试:根据您的说明,您拥有LYR中的所有记录以及JD和& VC拥有此表中的一些共享数据。但是JD& VC可能有也可能没有相同的数据,因此在这种情况下,您必须使用LEFT JOIN LYR作为主表,如下所示:

CREATE OR REPLACE VIEW TEST_VIEW AS
SELECT JD.REQ_ID,
       JD.REF_NO,
       LYR.OID_VAL,
       VCASE.ACCOUNT_STATUS,
       VCASE.ACCOUNT_NUMBER
FROM LYR 
LEFT JOIN JD ON JD.REQ_ID = LYR.REQ_ID
LEFT JOIN VC  ON LYR.REQ_ID = VC.REQUEST_ID;

答案 2 :(得分:0)

您当前的sql将仅显示所有三个表中存在数据的记录。听起来像你想要的sql将显示某些外连接中存在的数据。

第一个版本是将查询编写为UNION而不是JOIN(即两个查询中包含单个内连接,并且它们之间有UNION ALL)。这将是为了保证正确性。

从那里你可以使用外连接和可能表现更好的条件创建一些东西,但通常最好先确保正确性。

答案 3 :(得分:0)

由于您的查询内连接所有三个表,因此它只显示所有三个表中存在匹配数据的记录。据我了解,您希望在LYRJDLYRVCCREATE OR REPLACE VIEW TEST_VIEW AS SELECT JD.REQ_ID, JD.REF_NO, LYR.OID_VAL, VCASE.ACCOUNT_STATUS, VCASE.ACCOUNT_NUMBER FROM LYR LEFT JOIN JD ON (LYR.REQ_ID = JD.REQ_ID) LEFT JOIN VC ON (LYR.REQ_ID = VC.REQUEST_ID) WHERE JD.REQ_ID IS NOT NULL OR VC.REQUEST_ID IS NOT NULL; 中的匹配数据显示记录(或在所有三个中。)

我还没有意识到使用连接直接执行此操作的方法,所以我在其他条件下左键加入它们:

UNION

另一种可能的方法是使用UNION ALL(和 CREATE OR REPLACE VIEW TEST_VIEW AS SELECT JD.REQ_ID, JD.REF_NO, LYR.OID_VAL, VCASE.ACCOUNT_STATUS, VCASE.ACCOUNT_NUMBER FROM LYR INNER JOIN JD ON (LYR.REQ_ID = JD.REQ_ID) LEFT JOIN VC ON (LYR.REQ_ID = VC.REQUEST_ID) UNION SELECT JD.REQ_ID, JD.REF_NO, LYR.OID_VAL, VCASE.ACCOUNT_STATUS, VCASE.ACCOUNT_NUMBER FROM LYR INNER JOIN VC ON (LYR.REQ_ID = VC.REQUEST_ID) LEFT JOIN JD ON (LYR.REQ_ID = JD.REQ_ID); ):

ORDER BY 
    CASE WHEN p_filter_type = 'ASC' THEN
        CASE p_filter_column 
            WHEN 'projectCode' THEN projectCode -- varchar field
            WHEN 'visaType' THEN visaType -- varchar field
            WHEN 'approveRejectStatus' THEN `status` -- varchar field
            WHEN 'createdDate' THEN createdDate
            WHEN 'employeeID' THEN employeeId -- int field
            WHEN 'requestId' THEN requestId -- int field
            WHEN 'country' THEN country -- varchar field
            WHEN 'serviceDesk' THEN serviceDesk -- varchar field

    END
    END ASC,
    CASE    WHEN p_filter_type = 'DESC' THEN
                CASE p_filter_column 
            WHEN 'projectCode' THEN projectCode -- varchar field
            WHEN 'visaType' THEN visaType -- varchar field
            WHEN 'approveRejectStatus' THEN `status` -- varchar field
            WHEN 'createdDate' THEN createdDate
            WHEN 'employeeID' THEN employeeId -- int field
            WHEN 'requestId' THEN requestId -- int field
            WHEN 'country' THEN country -- varchar field
            WHEN 'serviceDesk' THEN serviceDesk -- varchar field

    END
    END DESC

答案 4 :(得分:0)

如果表格有匹配的列数,请执行以下操作: 创建或替换视图 TEST_VIEW AS ( 从 JD 中选择 * 联合所有 从 LYR 中选择 * 联合所有 从 VC 中选择 * );