【发布时间】:2021-06-02 17:54:49
【问题描述】:
我有两张桌子
- 相机
- 相机分享
还有一个用户表。
在 Cameras 表中有一个列 owner_id,在 Camera Shares 表中有一个列 user_id。
现在还有其他 3 个表格,例如
- 档案
- 比较
- 延时摄影
上面的每个表格都有一个camera_id,通过它连接到相机。
现在我创建了一个视图,它结合了这 3 个表中的所有数据
- 档案
- 比较
- 延时摄影
但是要从该 VIEW 中获取相机列表的数据。这些是我正在做的步骤。
- 获取用户提供的 user_id
- 查询 owner_id 等于 user_id 的相机表并获取相机 ID。
- 查询 user_id 等于 user_id 的相机共享表并获取相机 ID。
- 结合第 2 步和第 3 步中的相机 ID。
- 针对
camera_ids执行 IN 查询以查看
我的问题:
是否有可能以结合用户数据的方式创建 VIEW。当在 where 子句中传递 user_id 时,它会执行 VIEW 中的第 2、3、4 步。?任何帮助都会很棒。
这是我的观点
CREATE VIEW archives_view AS
WITH CORE AS (
SELECT
'ARCHIVES' AS TAB_NAME,
ARC.TITLE,
ARC.EXID,
ARC.CREATED_AT,
ARC.FROM_DATE,
ARC.TO_DATE,
NULL AS EMBED_CODE,
ARC.FILE_NAME,
ARC.FRAMES,
ARC.URL,
ARC.PUBLIC,
ARC.STATUS,
ARC.TYPE,
NULL AS EXTRA,
ARC.REQUESTED_BY,
ARC.CAMERA_ID
FROM
PUBLIC.ARCHIVES AS ARC
UNION ALL
SELECT
'TIMELAPSES',
TL.TITLE,
TL.EXID,
TL.INSERTED_AT,
TL.FROM_DATETIME,
TL.TO_DATETIME,
NULL AS EMBED_CODE,
NULL AS FILE_NAME,
NULL AS FRAMES,
NULL AS URL,
NULL AS PUBLIC,
TL.STATUS,
NULL AS TYPE,
TL.EXTRA,
TL.USER_ID,
TL.CAMERA_ID
FROM
PUBLIC.TIMELAPSES AS TL
UNION ALL
SELECT
'COMPARES',
COMP.EXID,
COMP.NAME,
COMP.INSERTED_AT,
COMP.BEFORE_DATE,
COMP.AFTER_DATE,
COMP.EMBED_CODE,
NULL AS FILE_NAME,
NULL AS FRAMES,
NULL AS URL,
COMP.PUBLIC,
COMP.STATUS,
NULL AS TYPE,
NULL AS EXTRA,
COMP.REQUESTED_BY,
COMP.CAMERA_ID
FROM
PUBLIC.COMPARES AS COMP ),
MORE_INFO AS (
SELECT
C.*,
TRIM(CONCAT(U.FIRSTNAME, ' ', U.LASTNAME)) AS REQUESTER_NAME,
U.EMAIL AS REQUESTER_EMAIL,
CAM.EXID AS CAMERA_EXID,
CAM.NAME,
CAM.NAME AS CAMERA_NAME,
CAM.TIMEZONE AS CAMERA_TIMEZONE,
U.ID AS USER_ID
FROM
CORE C
JOIN USERS U ON
C.REQUESTED_BY = U.ID
JOIN CAMERAS CAM ON
C.CAMERA_ID = CAM.ID )
SELECT
*
FROM
MORE_INFO
order by CREATED_AT DESC;
如果您想使用数据库和数据,则可以使用 DDL here。
【问题讨论】:
-
您可能希望创建一个接受
userId作为参数并返回表而不是视图的函数。 postgresql.org/docs/current/sql-createfunction.html -
任何相关的例子都很好,我对 Dbs 不太擅长
标签: sql postgresql