SQL - 获取Where条件的第一个匹配 - MS Access

时间:2012-05-26 16:13:18

标签: sql ms-access

我有一个销售数据集,看起来像这样

Product  sold.date
apple    01/jan/2012
banana   01/feb/2012
orange   01/mar/2012

在同一个周边会有一些活动,即

Campaign name      start           end
campaign1        01/jan/2012     15/feb/2012
campaign2        01/feb/2012     01/mar/2012

在SQL中,我如何只获得一个产品销售的广告系列?也就是说,香蕉在campaign1或campaign2中出售,不算作出售两次。

销售额依赖于哪个广告系列并不重要。将有多行销售将重叠超过1个广告系列。

任何帮助都会很棒......

1 个答案:

答案 0 :(得分:1)

为1个产品获得1个广告系列

您没有为您的RDBMS命名。在 PostgreSQL MySQL 中,您可以使用LIMIT 1

SELECT p.Product, c.Camgaign
FROM   p
LEFT   JOIN c ON p.sold_date BETWEEN c.start AND c.end
WHERE  p.Product = 'banana'
-- ORDER BY <something>
LIMIT  1;

我使用LEFT [OUTER] JOIN返回'banana'行,即使没有匹配的广告系列。在这种情况下,广告系列为NULL

使用ORDER BY 按照一些可用标准选择广告系列,而不只是获得符合条件的任意广告。

MS SQL 中,您将使用SELECT TOP n Oracle WHERE rownum <= 1;


为所有产品获得1个广告系列

WITH x AS (
    SELECT p.Product, c.Camgaign
          ,row_number() OVER (PARTITION BY p.Product) AS rn
    FROM   p
    LEFT   JOIN c ON p.sold_date BETWEEN c.start AND c.end
    WHERE  p.Product = 'banana'
    )
SELECT Product, Camgaign
FROM   x
WHERE  rn = 1
   OR  rn IS NULL;  -- to include prod. without campaign

PostgreSQL 中测试,适用于 MS SQL Server Oracle
MySQL 中不起作用,它既不支持CTE也不支持窗口函数。