Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 是否可以将不同表中的数据合并到一列中_Sql_Postgresql_Rdbms_Postgresql 9.6 - Fatal编程技术网

Sql 是否可以将不同表中的数据合并到一列中

Sql 是否可以将不同表中的数据合并到一列中,sql,postgresql,rdbms,postgresql-9.6,Sql,Postgresql,Rdbms,Postgresql 9.6,我试图用SQL模式实现以下JSON结构: "data_set": [ { "id": 0, "annotation": "foo", "value": { "type": "number", "value": 10.0, "unit": "m" } }, { "id": 1, "annotation": "bar", "value":

我试图用SQL模式实现以下JSON结构:

"data_set": [
    {
    "id": 0,
    "annotation": "foo",
    "value": 
        {
        "type": "number",
        "value": 10.0,
        "unit": "m"
        }  
    },
    {
    "id": 1,
    "annotation": "bar",
    "value": 
        {
        "type": "text",
        "value": "Hello World"
        }  
    }
]
棘手的部分是,我不仅要包含一种类型的值,还要包含不同类型的值。我的想法是为每个值设置不同的表格,例如:

numeric_value: id {PK} | type | value | unit

text_values: id {PK} | type | value
并通过外键将其包含在数据集合表中:

data_set: id {PK} | annotation | value {FK}

我的问题是,我不确定如何使用键引用一列中不同表的ID,当然,如果我在解决这个问题时采取了完全错误的方法

你可以用不同的方式来做。其中一种方法是只使用一个表,并将其定义为当
值类型
数字
时,您必须填写
数值
单位
(除此之外没有其他内容)的值,当它为
文本
时,您必须填写
文本\u值
列(其余部分不填写,保留为空)

这个定义可以做到:

CREATE TABLE data_set
(
    data_set_id integer PRIMARY KEY,
    annotation text,
    value_type text NOT NULL,
    numeric_value numeric,
    unit text,
    text_value text,

    /* Constraint to make sure values are consistent with definition */
    CHECK (CASE WHEN value_type = 'text' THEN 
              numeric_value IS     NULL AND unit IS     NULL AND text_value IS NOT NULL 
           WHEN      value_type = 'number' THEN 
              numeric_value IS NOT NULL AND unit IS NOT NULL AND text_value IS     NULL
           ELSE 
              false
           END)
) ;
以下插入内容有效:

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, numeric_value, unit)
VALUES
    (1, 'height', 'number', 10.0, 'm') ;

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, text_value)
VALUES
    (2, 'brand', 'text', 'BigBrand') ;
这些人不会:

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, text_value)
VALUES
    (3, 'brand', 'strange_type', 'misstake') ;

INSERT INTO 
    data_set 
    (data_set_id, annotation, value_type, text_value)
VALUES
    (4, 'brand', 'number', 'misstake') ;