将临时表连接到实际表

时间:2015-10-05 23:04:25

标签: sql postgresql amazon-redshift

我需要验证每个订单是否已得到确认。问题是每个订单可以有多个代码。我拥有的查询(使用CASE语句)将检查空白字段或字段“无”以确认订单尚未确认。它将返回适当的结果,但多个行(每个可能的响应一次),我只需要(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;

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

2 个答案:

答案 0 :(得分:1)

  

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

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

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是多余的。使用WHERE R.UTCDATE > SYSDATE - 10

  • 无论如何都不能为NULL 我的3子句中的
  • GROUP BY 是对CASE表达式的位置引用。或者你可以再拼出来:

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

答案 1 :(得分:0)

您可以按如下方式使用DISTINCT关键字,这样您就不需要临时表:

SELECT DISTINCT QUESTION,
ORDERNAME,
CASE CODE
  WHEN 'None' THEN 'No'
  WHEN '' THEN 'No'
  ELSE 'Yes'
FROM ORDERS
WHERE UTCDATE > SYSDATE - 10
AND CODE IS NOT NULL
AND CATEGORY IS NOT NULL
AND UTCDATE IS NOT NULL
ORDER BY 2,3;