sql - 将临时表连接到实际表

标签 sql postgresql amazon-redshift

我需要验证每个订单 是否已被确认。问题是每个订单可以有多个代码。我的查询(利用 CASE 语句)将检查空白字段或带有字符串“None”的字段以验证订单未被确认。它会返回适当的结果,但是多个行(每个可能的响应一次)而我只需要 (1)。

我正在尝试创建一个临时表,它将返回适当的结果并将两个表连接(通过订单唯一 ID)在一起,希望更正多行问题。这是代码:

DROP TABLE staging_TABLE;

CREATE TEMP TABLE staging_TABLE(
ORDERID varchar(256) ,
CODE varchar(256) );
/*Keeping data types consistent with the real table*/

INSERT INTO staging_TABLE
SELECT ORDERID,
CASE CODE
  WHEN 'None' THEN 'No'
  WHEN '' THEN 'No'
  ELSE 'Yes'
END
FROM ORDERS
WHERE UTCDATE > SYSDATE - 10
AND CODE IS NOT NULL;

SELECT R.QUESTION,
R.ORDERNAME,
T.CODE
FROM ORDERS R
INNER JOIN staging_TABLE T
ON R.ORDERID= T.ORDERID
WHERE R.UTCDATE > SYSDATE - 10
AND R.CODE IS NOT NULL
AND R.CATEGORY IS NOT NULL
AND R.UTCDATE IS NOT NULL
GROUP BY
         R.ORDER,
         T.CODE,
         R.ORDERNAME,
         R.CODE
ORDER BY 
R.ORDERNAME,
R.ORDER;

我这样做正确吗?或者这是正确的方法吗?

最佳答案

Am I doing this correctly? Or is this even the right approach?

没有。您不需要临时表。您的查询可能如下所示:

SELECT question, ordername
     , CASE WHEN code IN ('None', '') THEN 'No' ELSE 'Yes' END AS code
FROM   orders
WHERE  utcdate > sysdate - 10
AND    code IS NOT NULL
AND    category IS NOT NULL
GROUP  BY question, ordername, 3, "order"
ORDER  BY ordername, "order";
  • ORDER 是保留字。除非双引号,否则不能将其用作列名。那里有问题。

  • AND R.UTCDATE IS NOT NULL 是多余的。无论如何它都不能为 NULL WHERE R.UTCDATE > SYSDATE - 10

  • 我的 GROUP BY 子句中的
  • 3 是对 CASE 表达式的位置引用。或者,您可以再次拼写:

....
GROUP  BY question, ordername
        , CASE WHEN code IN ('None', '') THEN 'No' ELSE 'Yes' END
        , "order"

关于sql - 将临时表连接到实际表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32959243/

相关文章:

mysql 查询覆盖率

sql - SQL中的getAge取决于两个日期

sql - Rails 3 + 回形针 : N+1 Query

node.js - Nodejs 续写 Postgres

postgresql - 将字符串转换为列名

transactions - 如何在 AWS Redshift 中编写此案例的事务?

apache-spark - Parquet with Athena VS Redshift

Sql Postgres double group by

postgresql - Postgres : detect current transaction level

mysql - 驻留在 mysql 列中的字符串无法插入到 redshift 上完全相同的列中,指出 DDL 长度错误