2013-12-16 192 views
2

下面是oracle SQL,我想在Teradata格式中对其进行更改。teradata中的QUALIFY ROW_NUMBER

SELECT branch_code, 
    branch_no, 
    c_no, 
    cd_type 
FROM (
    SELECT branch_code, 
     branch_no, 
     c_no, 
     cd_type, 
     * * RANK() OVER (
      PARTITION BY c_no ORDER BY cd_type 
      ) RANK * * 
    FROM (
     SELECT branch_code, 
      branch_no, 
      c_no, 
      MIN(cd_type) cd_type 
     FROM EMPLOYEE 
     WHERE S_CODE = 'C' 
      AND (branch_no) NOT IN (
       SELECT branch_code 
       FROM DEPARTMENT 
       WHERE branch_code = 'ABC' 
       ) 
     ) 
    ) 
WHERE RANK = 1 

我已经使用QUALIFY作为如下。

SELECT branch_code, 
    branch_no, 
    c_no, 
    cd_type 
FROM (
    SELECT branch_code, 
     branch_no, 
     c_no, 
     cd_type, 
     * * QUALIFY ROW_NUMBER() OVER (
      PARTITION BY c_no ORDER BY cd_type 
      ) * * RANK 
    FROM (
     SELECT branch_code, 
      branch_no, 
      c_no, 
      MIN(cd_type) cd_type 
     FROM EMPLOYEE 
     WHERE S_CODE = 'C' 
      AND (branch_no) NOT IN (
       SELECT branch_code 
       FROM DEPARTMENT 
       WHERE branch_code = 'ABC' 
       ) 
     ) 
    ) 
WHERE RANK = 1 

但是,得到错误“预期之间的事情,与出线。

我们可以把select语句资格吗?

回答

2

你可能简化现有查询,因为这是没有有效的Oracle SQL( Inline View中没有GROUP BY)。另外,您还可以在NOT IN中比较branch_nobranch_code

否则埃德吉布斯回答可以进一步简化为:

SELECT branch_code, 
    branch_no, 
    c_no, 
    MIN(cd_type) cd_type 
FROM EMPLOYEE 
WHERE S_CODE = 'C' 
    AND (branch_no) NOT IN (
     SELECT branch_no 
     FROM DEPARTMENT 
     WHERE branch_code = 'ABC' 
     ) 
GROUP BY branch_code, 
    branch_no, 
    c_no 
QUALIFY 
    RANK() 
    OVER (PARTITION BY c_no 
     ORDER BY MIN(cd_type) = 1 

如果branch_no被定义为可为空,你也应该重写NOT INNOT EXISTS

2

通常情况下,像RANK计算倒数第二个分析的价值,加盟后过滤和GROUP BYHAVING。分析值后唯一做的是ORDER BY。这就是为什么在Oracle中,您需要将RANK放入内部查询中,然后在外部查询中测试其值。在Teradata中,QUALIFY在执行后分析函数和ORDER BY之前,这意味着您不需要外部查询来测试RANK值。

我没有进入到今天的Teradata,所以这个查询未经测试,但我喜欢把它很接近:

SELECT branch_code, 
    branch_no, 
    c_no, 
    cd_type 
FROM (
    SELECT branch_code, 
     branch_no, 
     c_no, 
     MIN(cd_type) cd_type 
    FROM EMPLOYEE 
    WHERE S_CODE = 'C' 
     AND (branch_no) NOT IN (
      SELECT branch_code 
      FROM DEPARTMENT 
      WHERE branch_code = 'ABC' 
     ) 
) 
QUALIFY ROW_NUMBER() OVER (PARTITION BY c_no ORDER BY cd_type) = 1 
+1

由于它是有益的。 – navku