【问题标题】:SQL - Using "Where In" for adjacent lists/columnsSQL - 对相邻列表/列使用“Where In”
【发布时间】:2020-11-23 21:39:48
【问题描述】:

我正在尝试构建一个 SQL 查询,该查询将根据输入的两个列表提取客户 ID 和订单类型以及订单日期的结果。这些列表包含客户 ID 和订单类型。

我想设置我的 WHERE IN 语句以匹配客户 ID 和订单 ID。因此,如果客户 1 使用订单类型 5,它将通过订单类型 5 拉客户 1 的最新购买。

到目前为止我所拥有的是:

SELECT
customer_id,
order_type_id,
order_date
FROM table
WHERE order_date > 2020-11-15
AND customer_id IN ({{LIST}})
AND order_type_id IN ({{LIST}})

如何组合两个 IN 语句?

【问题讨论】:

    标签: mysql sql postgresql


    【解决方案1】:

    Postgres 和 MySQL 都支持 元组。这允许您将查询表示为:

    SELECT customer_id, order_type_id, order_date
    FROM table
    WHERE order_date > 2020-11-15 AND
          (customer_id, order_type_id) IN ( (1, 5), . . . );
    

    这听起来像您正在寻找的。​​p>

    【讨论】:

      【解决方案2】:

      您想使用EXISTS 子句。

      我在制作中经常有这种需求。您不希望一个列表与另一个列表分开,而是要匹配一组特定的元组。在此示例中,我创建了一个临时表,并手动填充它。您可以从数据库中的其他地方提取特定的 cust_id、order_type_id 组合或将它们传递给存储过程或其他任何东西。

      您也可以通过对包含您的过滤器集的表进行 INNER JOIN 来完成相同的操作。

      Example Fiddle Here。您指定了 MySQL 和 Postgresql,所以我只是猜到了。任何 RDMS 的原理都是一样的。

      CREATE TABLE MyTable
      (customer_id int
      , order_type_id int
      , order_date date);
      
      INSERT INTO MyTable (customer_id,order_type_id,order_date)
      VALUES
        (1,3,'2020-11-20')
      , (1,3,'2020-11-01')
      , (1,4,'2020-11-30')
      , (1,5,'2020-11-25')
      , (1,5,'2020-11-01')
      , (1,5,'2020-11-25')
      
      , (2,6,'2020-11-01')
      , (2,6,'2020-11-25')
      , (2,6,'2020-11-30')
      , (2,7,'2020-11-25')
      , (2,7,'2020-11-25')
      , (2,8,'2020-11-01')
      , (2,8,'2020-11-25');
      
      CREATE TEMPORARY TABLE CustOrd (customer_id int,order_type_id int);
      
      INSERT INTO CustOrd (customer_id,order_type_id)
      VALUES
      (1,3)
      ,(1,5)
      ,(2,7)
      ,(2,8);
      
      
      SELECT
      customer_id,
      order_type_id,
      order_date
      FROM MyTable t
      WHERE order_date > '2020-11-15'
      AND EXISTS (SELECT null 
                  FROM CustOrd co 
                  WHERE t.customer_id = co.customer_id 
                  AND t.order_type_id = co.order_type_id);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-15
        • 2022-01-02
        • 1970-01-01
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        • 2018-03-09
        相关资源
        最近更新 更多