postgresql - 如何跟踪查询中的多个标识列

标签 postgresql

我有以下数据结构...

CREATE TABLE MAIN.ADDRESS(
  ID UUID PRIMARY KEY DEFAULT GEN_RANDOM_UUID() NOT NULL,
  ADDRESS_LINE1 VARCHAR(100) NOT NULL,
  ADDRESS_LINE2 VARCHAR(100),
  CITY VARCHAR(50) NOT NULL,
  STATE VARCHAR(2) NOT NULL,
  ZIP VARCHAR(5) NOT NULL
);
CREATE TABLE MAIN.PERSON(
  ID UUID PRIMARY KEY DEFAULT GEN_RANDOM_UUID(),
  NAME VARCHAR(100) NOT NULL,
  PHONE VARCHAR(13) NOT NULL,
  EMAIL VARCHAR(100) NOT NULL,
  ADDRESS_ID UUID NOT NULL REFERENCES MAIN.ADDRESS(ID),
);
CREATE TABLE MAIN.STORE(
  ID UUID PRIMARY KEY DEFAULT GEN_RANDOM_UUID(),
  NAME VARCHAR(100) NOT NULL,
  PHONE VARCHAR(13) NOT NULL,
  EMAIL VARCHAR(100) NOT NULL,
  MANAGER_ID UUID NOT NULL REFERENCES MAIN.PERSON(ID),
  ADDRESS_ID UUID REFERENCES MAIN.ADDRESS(ID)
);

现在我正在编写要插入的查询。第一步(添加商店经理)使用此查询...

WITH STORE_MANAGER_ADDRESS AS(
  INSERT INTO MAIN.ADDRESS (ADDRESS_LINE1, CITY, STATE, ZIP) 
  VALUES ('4321 Hubbard Ave', 'Columbus', 'OH', '43217')
  RETURNING ID
)
INSERT INTO MAIN.PERSON (NAME, PHONE, EMAIL, ADDRESS_ID)
SELECT 'John Doe','15555555555','jd@gmail.com', ID
FROM STORE_MANAGER_ADDRESS;

现在我想添加商店,所以我想可能是这样的......

DECLARE STORE_MANAGER_ADDRESS_ID UUID;
DECLARE STORE_ADDRESS_ID UUID;
DECLARE STORE_MANAGER_PERSON_ID UUID;
WITH STORE_MANAGER_ADDRESS AS(
  INSERT INTO MAIN.ADDRESS (ADDRESS_LINE1, CITY, STATE, ZIP) 
  VALUES ('4321 Hubbard Ave', 'Columbus', 'OH', '43217')
  RETURNING ID
)
SELECT ID FROM STORE_MANAGER_ADDRESS INTO STORE_MANAGER_ADDRESS_ID
WITH STORE_MANAGER AS(
  INSERT INTO MAIN.PERSON (NAME, PHONE, EMAIL, ADDRESS_ID)
  VALUES ('John Doe','15555555555','jd@gmail.com', STORE_MANAGER_ADDRESS_ID)
  RETURNING ID
)
SELECT ID FROM STORE_MANAGER INTO STORE_MANAGER_PERSON_ID
WITH STORE_ADDRESS AS(
  INSERT INTO MAIN.ADDRESS (ADDRESS_LINE1, CITY, STATE, ZIP) 
  VALUES ('1234 Main St', 'Columbus', 'OH', '43201')
  RETURNING ID
)
SELECT ID FROM STORE_ADDRESS INTO STORE_ADDRESS_ID
INSERT INTO MAIN.STORE (NAME, PHONE, EMAIL, MANAGER_ID, ADDRESS_ID)
VALUES ('Store 1', '1231231234','a@b.com',STORE_MANAGER_PERSON_ID, STORE_ADDRESS_ID)

但它失败了,

syntax error at or near "UUID"
name: error
length: 93
severity: ERROR
code: 42601
position: 34
file: scan.l
line: 1087
routine: scanner_yyerror

我错过了什么?我将如何处理这样的事情?

最佳答案

在一个查询中使用多个 CTE:

WITH STORE_MANAGER_ADDRESS AS(
  INSERT INTO MAIN.ADDRESS (ADDRESS_LINE1, CITY, STATE, ZIP) 
  VALUES ('4321 Hubbard Ave', 'Columbus', 'OH', '43217')
  RETURNING ID AS STORE_MANAGER_ADDRESS_ID
),
STORE_MANAGER AS(
  INSERT INTO MAIN.PERSON (NAME, PHONE, EMAIL, ADDRESS_ID)
  SELECT 'John Doe',
         '15555555555',
         'jd@gmail.com',
         STORE_MANAGER_ADDRESS_ID
  FROM STORE_MANAGER_ADDRESS
  RETURNING ID AS STORE_MANAGER_PERSON_ID
),
STORE_ADDRESS AS(
  INSERT INTO MAIN.ADDRESS (ADDRESS_LINE1, CITY, STATE, ZIP) 
  VALUES ('1234 Main St', 'Columbus', 'OH', '43201')
  RETURNING ID AS STORE_ADDRESS_ID
)
INSERT INTO MAIN.STORE (NAME, PHONE, EMAIL, MANAGER_ID, ADDRESS_ID)
SELECT 'Store 1',
       '1231231234',
       'a@b.com',
       STORE_MANAGER.STORE_MANAGER_PERSON_ID,
       STORE.ADDRESS.STORE_ADDRESS_ID
FROM STORE_MANAGER CROSS JOIN STORE ADDRESS;

关于postgresql - 如何跟踪查询中的多个标识列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48370722/

相关文章:

mysql - Django Postgres 聚合函数

performance - 如何将一个表中的数据插入/更新到另一个表(postgresql)?

postgresql - 选择 Postgres 数据库中没有任何空值的记录

postgresql - 提取日和月时前导零

node.js - 为什么我的 Model.find 什么也没返回?

python - 自定义 postgres 范围类型的 SQLalchemy 表示

python - 过滤 Django 时保持带注释的排名

sql - 棘手的 postgresql 查询优化(带排序的不同行聚合)

postgresql - Postgresql 约束一个字符类型

返回记录数的 Postgresql 函数