# SQL 视图

By [honey](https://paragraph.com/@duoergun) · 2024-01-22

---

SxT 中的视图
========

空间和时间当前支持三种类型的视图。

1.  **标准** - 标准视图是基于 SQL 语句执行结果的虚拟表。标准视图不保存 SQL 语句生成的数据。当您查询标准视图时，会执行底层 SQL 语句，并将结果显示为真实的表。
    
2.  **物化**\- 与标准视图不同，物化视图保存执行基础查询的结果。物化视图可以按用户定义的时间间隔刷新，每次执行基础查询时都会保存新数据。
    
3.  **参数化**\- 参数化视图类似于标准视图，不同之处在于它可以采用针对视图执行查询时提供的附加参数。
    

如何在 SxT 中创建视图
=============

1.  视图是使用与在空间和时间中创建表相同的[配置资源 (DDL)端点创建的。](https://docs.spaceandtime.io/reference/configure-resources-ddl)
    
2.  至少，您必须为正在创建视图的资源 ID 提供具有 CREATE 权限的 Biscuit。如果您的查询运行所针对的基础表是使用权限创建的，则此方法有效。如果您的视图将查询的表是，那么您还需要为基础表提供具有适当权限的 Biscuit 。`access_type=public_readaccess_type=permissionedSELECT`
    

创建标准视图
------

卷曲

    curl -i --request POST \               
         --url "https://<API_URL>/v1/sql/ddl" \
         --header "accept: application/json" \
         --header "authorization: Bearer <ACCESS_TOKEN>" \
         --header "content-type: application/json" \
         --data '
    {
      "biscuits": ["EuwBCoEBCg5zeHQ6Y2Fw..."],
      "sqlText": "CREATE VIEW SE_LAND.my_new_view WITH \"public_key=<BISCUIT_PUBLIC_KEY>\" AS SELECT * FROM SE_LAND.ofac_eth"
    }
    '
    

下面仔细看看我们正在执行的 SQL：

SQL

    CREATE VIEW SE_LAND.my_new_view 
    WITH \"public_key=<BISCUIT_PUBLIC_KEY>\" 
    AS 
    SELECT * 
    FROM SE_LAND.ofac_eth;
    

1.  视图名称为，其完整资源ID为`my_new_viewSE_LAND.my_new_view`
    
2.  基础表是，其完整的resourceId是`ofac_ethSE_LAND.ofac_eth`
    
3.  这是用于授予权限的密钥对的饼干**公钥**一侧。 也就是说，与包含此事实的饼干关联的饼干公钥：`public_keycreate`
    

    sxt:capability("ddl_create", "se_land.my_new_view");
    

1.  如果基础表 ( ) 是这样创建的，那么您还需要向创建命令提供一个饼干，其中包含以下事实：`ofac_ethaccess_type=permissioned`
    

    sxt:capability("dql_select", "se_land.ofac_eth");
    

创建物化视图
------

材质视图可以用几乎相同的方式创建。有一项是必需的差异，另一项是可选的。

首先，您必须告诉 SxT 您想要创建一个物化视图。这就像添加到 SQL CREATE 命令一样简单，如下所示：`MATERIALIZED`

SQL

    CREATE MATERIALIZED VIEW se_playground.my_new_mat_view...
    

下一个标志是可选的，允许您设置查询的时间（以分钟为单位）。刷新间隔定义了后端执行查询的频率。`refresh_interval`

SQL

    CREATE MATERIALIZED VIEW se_playground.my_new_mat_view 
    WITH \"public_key=<BISCUIT_PUBLIC_KEY>,refresh_interval=30\" 
    AS 
    SELECT * 
    FROM se_playground.ofac_eth;
    

*   **目前，物化视图被硬编码为每天刷新一次。在短期内，这将更改为使用刷新间隔，因此强烈建议设置为所需的长度（或 1440 = 每天分钟）**
    
*   **材质视图的 access\_type 直接从基础表派生，不需要在 create 语句中指定。**
    
*   **指定的饼干公钥仅用于针对物化视图的 DDL（创建和删除）操作。**
    

创建参数化视图
-------

参数化视图与标准视图类似，不同之处在于它可以采用针对视图执行查询时提供的附加参数。因此，当我们创建视图时，我们也会定义参数。

卷曲

    curl --location '<API_URL>/v1/sql/ddl' \
    --header 'Content-Type: application/json' \
    --header 'Authorization: Bearer ACCESS_TOKEN' \
    --data '{
        "biscuits": [
            "<BISCUIT-WITH-CREATE-PERMS>"
        ],
        "sqlText": "CREATE PARAMETERIZED VIEW se_land.my_new_para_view WITH \"public_key=<BISCUIT_PUBLIC_KEY>\" AS SELECT * FROM se_land.dnft_42 WHERE POINTS>@param1"
        }'
    

我们来看看SQL：

SQL

    CREATE PARAMETERIZED VIEW se_land.my_new_para_view 
    WITH "public_key=<BISCUIT_PUBLIC_KEY>" 
    AS 
    SELECT 
        * 
    FROM 
        se_lan.dnft_42 
    WHERE 
        POINTS > @param1;
    

如您所见，我们用 指定参数。`@param1`

查询视图
----

查询视图的方式与查询任何其他表的方式相同。

1.  标准
    
    *   `SELECT * FROM SE_LAND.my_new_view`
        
2.  物化
    
    *   `SELECT * FROM SE_LAND.my_new_mat_view`
        
3.  参数化
    
    *   `SELECT * FROM SE_LAND.my_new_para_view('param1=4')`或具有多个参数：
        
    *   `SELECT * FROM SE_LAND.my_new_para_view('param1=10','param2=20')`
        

删除视图：
-----

请注意，应该是完整的资源 ID。例如，`VIEW_NAMESE_LAND.my_new_para_view`

`DROP VIEW <VIEW_NAME>`

`DROP MATERIALIZED VIEW <VIEW_NAME>`

`DROP PARAMETERIZED VIEW <VIEW_NAME>`

---

*Originally published on [honey](https://paragraph.com/@duoergun/sql)*
