【问题标题】:what is the query in oracle sql to find product orders before a certain date?在 oracle sql 中查找某个日期之前的产品订单的查询是什么?
【发布时间】:2020-08-26 06:43:08
【问题描述】:

我如何找到所有在 2017 年之前下订单的客户。列表必须包括客户 ID、客户名称,并在 desc 中按他们的 ID 值排序

CREATE TABLE employees
      (
        employee_id NUMBER 
                    GENERATED BY DEFAULT AS IDENTITY START WITH 108 
                    PRIMARY KEY,
        first_name VARCHAR( 255 ) NOT NULL,
        last_name  VARCHAR( 255 ) NOT NULL,
        email      VARCHAR( 255 ) NOT NULL,
        phone      VARCHAR( 50 ) NOT NULL ,
        hire_date  DATE NOT NULL          ,
        manager_id NUMBER( 12, 0 )        , -- fk
        job_title  VARCHAR( 255 ) NOT NULL,
        CONSTRAINT fk_employees_manager 
            FOREIGN KEY( manager_id )
            REFERENCES employees( employee_id )
            ON DELETE CASCADE
      );
    -- product category
    CREATE TABLE product_categories
      (
        category_id NUMBER 
                    GENERATED BY DEFAULT AS IDENTITY START WITH 6 
                    PRIMARY KEY,
        category_name VARCHAR2( 255 ) NOT NULL
      );


    -- products table
    CREATE TABLE products
      (
        product_id NUMBER 
                   GENERATED BY DEFAULT AS IDENTITY START WITH 289 
                   PRIMARY KEY,
        product_name  VARCHAR2( 255 ) NOT NULL,
        description   VARCHAR2( 2000 )        ,
        standard_cost NUMBER( 9, 2 )          ,
        list_price    NUMBER( 9, 2 )          ,
        category_id   NUMBER NOT NULL         ,
        CONSTRAINT fk_products_categories 
          FOREIGN KEY( category_id )
          REFERENCES product_categories( category_id ) 
          ON DELETE CASCADE




     CREATE TABLE customers
          (
            customer_id NUMBER 
                        GENERATED BY DEFAULT AS IDENTITY START WITH 320 
                        PRIMARY KEY,
            name         VARCHAR2( 255 ) NOT NULL,
            address      VARCHAR2( 255 )         ,
            website      VARCHAR2( 255 )         ,
            credit_limit NUMBER( 8, 2 )
          );



        CREATE TABLE orders
          (
            order_id NUMBER 
                     GENERATED BY DEFAULT AS IDENTITY START WITH 106 
                     PRIMARY KEY,
            customer_id NUMBER( 6, 0 ) NOT NULL, -- fk
            status      VARCHAR( 20 ) NOT NULL ,
            salesman_id NUMBER( 6, 0 )         , -- fk
            order_date  DATE NOT NULL          ,
            CONSTRAINT fk_orders_customers 
              FOREIGN KEY( customer_id )
              REFERENCES customers( customer_id )
              ON DELETE CASCADE,
            CONSTRAINT fk_orders_employees 
              FOREIGN KEY( salesman_id )
              REFERENCES employees( employee_id ) 
              ON DELETE SET NULL
          );


        CREATE TABLE order_items
          (
            order_id   NUMBER( 12, 0 )                                , -- fk
            item_id    NUMBER( 12, 0 )                                ,
            product_id NUMBER( 12, 0 ) NOT NULL                       , -- fk
            quantity   NUMBER( 8, 2 ) NOT NULL                        ,
            unit_price NUMBER( 8, 2 ) NOT NULL                        ,
            CONSTRAINT pk_order_items 
              PRIMARY KEY( order_id, item_id ),
            CONSTRAINT fk_order_items_products 
              FOREIGN KEY( product_id )
              REFERENCES products( product_id ) 
              ON DELETE CASCADE,
            CONSTRAINT fk_order_items_orders 
              FOREIGN KEY( order_id )
              REFERENCES orders( order_id ) 
              ON DELETE CASCADE
          );

【问题讨论】:

  • 您想要客户订单历史记录,但我没有看到任何与客户或订单相关的表格......

标签: sql oracle date join select


【解决方案1】:

为了达到预期的结果,我们需要 Orders 和 Customers 表。 试试这个

SELECT C.CUSTOMER_ID, C.NAME
FROM CUSTOMERS C, ORDERS O
WHERE O.CUSTOMER_ID = C.CUSTOMER_ID AND O.ORDER_DATE < '01-JAN-2017'
ORDER BY C.CUSTOMER_ID DESC;

【讨论】:

    【解决方案2】:

    您可以使用以下查询。

        Select customers.customer_id, customers.name
        from customers join orders
        on customers.customer_id = orders.customer_id
        where year(orders.order_date) < 2017
        order by customers.customer_id desc;
    

    【讨论】:

      【解决方案3】:

      您可以使用 exists 和相关子查询来过滤在 2017 年之前订购的客户。我们可以通过查看 orders 表来获取该信息:

      select c.customer_id, c.name
      from customers c
      where exists (
          select 1 
          from orders o 
          where o.customer_id = c.customer_id and o.order_date < date '2017-01-01'
      )
      order by c.customer_id desc
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-04-11
        • 2011-03-28
        • 2018-07-25
        • 2015-05-12
        • 1970-01-01
        • 1970-01-01
        • 2014-06-17
        • 2020-12-16
        相关资源
        最近更新 更多