在数据库中,我有两个链接表,用于存储鱼类着陆记录。所需的业务是这些着陆每周定价一次,然后在一周后发布,以便允许那些付款的人检查文书工作。该系统多年来一直运作良好,但上周用户以某种方式改变了记录,使得一种特定种类和大小的鱼的价格不同,并且因此阻止了其他操作的发生。
我现在需要添加额外的验证检查(即使重复事件的可能性很小)。为此,我设计了一些复制问题的虚假数据,并设计了查询的第一个简单部分来进行搜索。
这是查询的第一部分;
SELECT DISTINCT
ld.ProductId, ld.UnitPrice
FROM
LandingDetails ld
JOIN
LandingHeaders lh ON ld.LandingId = lh.LandingId
WHERE
lh.LandingDate1 BETWEEN '20160313' AND '20160319'
以下是返回记录类型的示例;
正如您所看到的,ProductId列出了不同的价格。从这一点开始,我想对此进行修改,以便不再返回日期中所有不同的ProductId和价格,而只返回那些有两个不同价格的ProductId。我正在寻找的是SQL中实现这一目标的最有效方法。我不需要价格,仅仅知道哪个产品需要在我还没有编写的单独程序中更改价格就足够了。
答案 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