识别具有不同值的行的最有效方法是什么

时间:2016-04-30 07:18:24

标签: sql sql-server-2014

在数据库中,我有两个链接表,用于存储鱼类着陆记录。所需的业务是这些着陆每周定价一次,然后在一周后发布,以便允许那些付款的人检查文书工作。该系统多年来一直运作良好,但上周用户以某种方式改变了记录,使得一种特定种类和大小的鱼的价格不同,并且因此阻止了其他操作的发生。

我现在需要添加额外的验证检查(即使重复事件的可能性很小)。为此,我设计了一些复制问题的虚假数据,并设计了查询的第一个简单部分来进行搜索。

这是查询的第一部分;

SELECT DISTINCT 
    ld.ProductId, ld.UnitPrice 
FROM 
    LandingDetails ld 
JOIN 
    LandingHeaders lh ON ld.LandingId = lh.LandingId
WHERE 
    lh.LandingDate1 BETWEEN '20160313' AND '20160319'

以下是返回记录类型的示例;

enter image description here

正如您所看到的,ProductId列出了不同的价格。从这一点开始,我想对此进行修改,以便不再返回日期中所有不同的ProductId和价格,而只返回那些有两个不同价格的ProductId。我正在寻找的是SQL中实现这一目标的最有效方法。我不需要价格,仅仅知道哪个产品需要在我还没有编写的单独程序中更改价格就足够了。

4 个答案:

答案 0 :(得分:2)

SELECT 
    ld.ProductId
FROM 
    LandingDetails ld 
JOIN 
    LandingHeaders lh ON ld.LandingId = lh.LandingId
WHERE 
    lh.LandingDate1 BETWEEN '20160313' AND '20160319'
GROUP BY ld.ProductId
HAVING COUNT(DISTINCT ld.UnitPrice)>1

答案 1 :(得分:1)

使用exists来检查与id具有不同价格匹配的任何记录:

first_name

答案 2 :(得分:1)

最直接的方法是使用使用HAVING clause的外部查询包装查询:

SELECT q.ProductId 
FROM (
SELECT DISTINCT 
    ld.ProductId, ld.UnitPrice 
FROM 
    LandingDetails ld 
JOIN 
    LandingHeaders lh ON ld.LandingId = lh.LandingId
WHERE 
    lh.LandingDate1 BETWEEN '20160313' AND '20160319'
) q 
GROUP BY q.ProductId 
HAVING COUNT(1) >= 2

答案 3 :(得分:1)

如果您希望ProductId 价格不同,则可以使用组计数

SELECT *
FROM
 (
   SELECT -- DISTINCT replaced by GROUP BY, because OVER is processed after GROUP
       ld.ProductId, ld.UnitPrice,
       COUNT(*) OVER (PARTITION BY ld.ProductId) AS cnt
   FROM 
       LandingDetails ld 
   JOIN 
       LandingHeaders lh ON ld.LandingId = lh.LandingId
   WHERE 
       lh.LandingDate1 BETWEEN '20160313' AND '20160319' 
   GROUP BY 
       ld.ProductId, ld.UnitPrice
 ) AS dt
WHERE cnt > 1
ORDER BY ld.ProductId, ld.UnitPrice