我知道这些问题已被多次询问,但它没有解决我的问题。
我有三个表,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。
答案 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)
由于您的查询内连接所有三个表,因此它只显示所有三个表中存在匹配数据的记录。据我了解,您希望在LYR
和JD
和LYR
中VC
和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);
):
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 中选择 * );