我有一个表,它是系统中每个项目的列表。有一列说明该项目是否为默认项目。在查询中,我将浏览项目并选择具有与之关联的MSDS的项目,但是我的查询会返回相同项目编号的多个项目,因为项目存在多个记录。
所以我想做的是将结果限制为默认项目。通常我会做WHERE itemsrc.itemsrc_default
,但是并不是每个项目都设置了默认记录,所以我要做的就是通过表格,如果项目存在默认记录而不是优先考虑该项目,否则,如果不存在默认记录,则返回该项目编号的第一条记录。
我不确定我是否会在主查询的WHERE子句中将其作为子查询执行,或者我是否应该创建检查默认值的函数。
答案 0 :(得分:2)
您可以使用DISTINCT ON
SELECT DISTINCT ON (ItemID) ItemID, itemsrc_default, Column1, Column2
FROM itemsrc
ORDER BY ItemID, itemsrc_default DESC, Column1, Column2;
来自文档:
DISTINCT ON(expression [,...])仅保留给定表达式求值的每组行的第一行。使用与ORDER BY相同的规则解释DISTINCT ON表达式(参见上文)。请注意,除非使用ORDER BY确保首先显示所需的行,否则每个集合的“第一行”都是不可预测的。
<强> Simple Demo on SQL Fiddle 强>
您还可以使用ROW_NUMBER()
SELECT *
FROM ( SELECT ...,
ROW_NUMBER() OVER(PARTITION BY ItemID ORDER BY itemsrc_default DESC, SomeCol) AS RowNum
FROM itemsrc
) i
WHERE RowNum = 1;
<强> Example using ROW_NUMBER 强>
答案 1 :(得分:0)
SELECT *
FROM itemsrc src
WHERE itemsrc_default = True
OR NOT EXISTS (
SELECT * FROM itemsrc nx
WHERE nx.itemId = src.itemID
AND nx.key_column < src.key_column
);