【问题标题】:Is it possible to use an expression list with where-in clause in Teradata是否可以在 Teradata 中使用带有 where-in 子句的表达式列表
【发布时间】:2015-10-29 23:02:46
【问题描述】:

Here are the Oracle docs for what I'm trying to do。文档中的第三个示例是否可以在 Teradata 中使用?

我创建了一个 SQL fiddle 来显示我的问题。我只想选择 Corvette 第 7 代和 Mustang 第 1 代车辆的订单。这在 oracle 中运行良好,但是当我尝试从 Teradata 会话执行它时,它失败了

选择失败。 3707: 语法错误,预期类似于 'SELECT' 关键字或'('或'NONTEMPORAL'关键字或'('之间的'AS'关键字 和整数'120777'。

SQL Fiddle

Oracle 11g R2 架构设置

CREATE TABLE CAR_ORDERS
(
    ORD_ID INTEGER NOT NULL,
    MODEL_NAME VARCHAR2(20) NOT NULL,
    GENERATION INTEGER NOT NULL,
    BEGIN_YEAR INTEGER NOT NULL,
    END_YEAR INTEGER NOT NULL
 );


INSERT INTO CAR_ORDERS VALUES(1,  'CORVETTE', 1, 1953, 1962);
INSERT INTO CAR_ORDERS VALUES(2,  'CORVETTE', 1, 1953, 1962);
INSERT INTO CAR_ORDERS VALUES(3,  'CORVETTE', 1, 1953, 1962);
INSERT INTO CAR_ORDERS VALUES(4,  'CORVETTE', 1, 1953, 1962);
INSERT INTO CAR_ORDERS VALUES(5,  'CORVETTE', 2, 1963, 1967);
INSERT INTO CAR_ORDERS VALUES(6,  'CORVETTE', 3, 1968, 1982);
INSERT INTO CAR_ORDERS VALUES(7,  'CORVETTE', 4, 1984, 1996);
INSERT INTO CAR_ORDERS VALUES(8,  'CORVETTE', 5, 1997, 2004);
INSERT INTO CAR_ORDERS VALUES(9,  'CORVETTE', 6, 2005, 2013);
INSERT INTO CAR_ORDERS VALUES(10, 'CORVETTE', 6, 2005, 2013);
INSERT INTO CAR_ORDERS VALUES(11, 'CORVETTE', 7, 2014, 2016);
INSERT INTO CAR_ORDERS VALUES(12, 'CORVETTE', 7, 2014, 2016);
INSERT INTO CAR_ORDERS VALUES(13, 'CORVETTE', 7, 2014, 2016);
INSERT INTO CAR_ORDERS VALUES(14, 'CORVETTE', 7, 2014, 2016);
INSERT INTO CAR_ORDERS VALUES(15, 'MUSTANG', 1, 1964, 1973);

查询 1

SELECT *
  FROM CAR_ORDERS CO
 WHERE (CO.MODEL_NAME, CO.GENERATION) IN (('CORVETTE', 7), ('MUSTANG', 1))

Results

| ORD_ID | MODEL_NAME | GENERATION | BEGIN_YEAR | END_YEAR |
|--------|------------|------------|------------|----------|
|     11 |   CORVETTE |          7 |       2014 |     2016 |
|     12 |   CORVETTE |          7 |       2014 |     2016 |
|     13 |   CORVETTE |          7 |       2014 |     2016 |
|     14 |   CORVETTE |          7 |       2014 |     2016 |
|     15 |    MUSTANG |          1 |       1964 |     1973 |

【问题讨论】:

    标签: oracle teradata


    【解决方案1】:

    你可以在 TERADATA 中做这样的事情:

    CREATE TABLE CAR_ORDERS
    AS SELECT * FROM TABLE_NAME 
    WHERE   
    (MODEL_NAME='CORVETTE' and GENERATION=7) 
    OR  
    (MODEL_NAME='MUSTANG' and GENERATION=1)
    WITH DATA;
    

    如果可行,那就很好,如果不行,请先尝试创建表,然后使用 INSERT QUERY:

    INSERT INTO CAR_ORDERS
    SELECT * FROM TABLE_NAME 
    WHERE   
    (MODEL_NAME='CORVETTE' and GENERATION=7) 
    OR  
    (MODEL_NAME='MUSTANG' and GENERATION=1);
    

    【讨论】:

    • 这只是一些示例数据;我试图对其执行查询的表中有 40 亿行,并且我有多个条件。因此,出于性能原因,我希望避免使用“OR”策略。
    猜你喜欢
    • 2011-01-05
    • 2013-09-12
    • 1970-01-01
    • 2012-07-21
    • 2014-02-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多