在 t-SQL 中使用 LEFT JOIN、ORDERED BY 进行 SELECT DISTINCT

2024-01-06

我在 SQL Server 2008 中有下表:

CREATE TABLE tbl (ID INT, dtIn DATETIME2, dtOut DATETIME2, Type INT)

INSERT tbl VALUES
(1, '05:00', '6:00', 1),
(2, '05:00', '7:00', 1),
(3, '05:01', '8:00', 1),
(4, '05:00', '8:00', 1),
(5, '05:00', '6:00', 2),
(6, '05:00', '7:00', 2)

选择相同类型、具有相同 dtIn 日期的所有记录的 ID,按 stOut 升序排列:

SELECT DISTINCT tbl.id FROM tbl   
  LEFT JOIN tbl AS t1
  ON tbl.type = t1.type AND
     tbl.dtIn = t1.dtIn
  ORDER BY tbl.dtOut ASC

但这给了我一个错误:

如果 SELECT DISTINCT 为 ORDER BY 项,则必须出现在选择列表中 指定的

我尝试将 ORDER BY 放在不同的地方,但这一切似乎都不起作用。我在这里做错了什么?


按未包含在 DISTINCT 项列表中的列进行 ORDER 是没有意义的。

让我们使用一个简单的场景。首先,一张桌子FruitPerson:

Fruit  PersonName
-----  ------
Apple  Joe
Apple  Mary
Peach  Karen
Peach  Lance

这是与您想要执行的操作等效的查询:

SELECT DISTINCT Fruit
FROM FruitPerson
ORDER BY PersonName;

此查询的结果不带ORDER BY这是:

Fruit
-----
Apple
Peach

但现在的问题是:引擎应该如何对这两个值“Apple”和“Peach”进行排序PersonName? Which人名?每个水果有两个人!到底应该使用哪个名称来决定是否Apple or Peach首先?

相反,将您的查询重写为聚合:

SELECT Fruit, MinName = Min(PersonName) -- which name to order on
FROM FruitPerson
GROUP BY Fruit -- here's how you get your distinctness
ORDER BY MinName;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 t-SQL 中使用 LEFT JOIN、ORDERED BY 进行 SELECT DISTINCT 的相关文章

随机推荐