2017-02-27 236 views
0

我知道这个问题已经被问了好几次,但是它并没有解决我的问题。通过从三个表格中提取数据创建视图

我有三张表,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; 

我想,改变了连接类型的其他加入像左外等,但并没有work.Any帮助将关于SQL这一观点可以理解的。

在此先感谢, KB。

+0

您选择JD,LYR和vcase列,从JD,LYR和VC ... – jarlh

+0

添加一些示例表数据和预期的结果 - 以及格式化文本。 – jarlh

+0

请编辑您的问题,以包括样本数据和预期的输出... – JohnHC

回答

0

试试这个:根据你的描述你在LYR的所有记录,这两个表JD & VC从该表中有一些共享的数据。但JD & VC可能会或可能不会有相同的数据,因此在这种情况下,你所要做的LEFT JOINLYR为主要表下面给出:

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; 
+0

谢谢你们的快速帮助。我遵循Suraz的建议,似乎它正在工作,稍后我会做更多的检查。 –

+0

这是否会避免在LYR中选择没有JD或VC中没有匹配行的行? –

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; 
0

当前的SQL将显示的记录只有在数据存在于所有三个表。这听起来像你想要的SQL将显示数据目前在某些类型的外部连接。

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

从那里你可能可以创建一些使用外部连接的地方,以及哪些条件可能表现更好,但通常最好是首先确保正确性。

0

由于您的查询内连接所有三个表,它将只显示在所有三个表中匹配数据的记录。据我了解,你想记录显示LYRJD匹配的数据在LYRVC(或全部三个)匹配的数据。

我不知道的一个办法直接做到这一点使用连接,所以我会离开,加入有附加条件他们:

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 (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); 
+0

谢谢Jiri Tousek的帮助。申请它。你的sql也起作用了,由于union,它只是更多的SQL,并且我在这三个表中都有大量的字段,所以它将是巨大的代码。再次感谢。 –

相关问题