当前位置: 首页 > 面试题库 >

使用LEFT JOIN进行SELECT DISTINCT,在t-SQL中按BYDER

南门祯
2023-03-14
问题内容

我在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放在不同的地方,但这似乎不起作用。我在这里做错了什么?


问题答案:

当您将其范围缩小到单个ID时,您就有可能每个ID可能都具有多个dtOut关联的ID 。发生这种情况时,Sql Server将如何知道要使用哪个命令?

您可以尝试:

SELECT t1.id
FROM tbl t1
LEFT JOIN  tbl t2 on t1.type = t2.type AND t1.dtIn = t2.dtIn
GROUP BY t1.id, t2.dtOut
ORDER BY t2.dtOut

但是,如上所述,如果它与右侧表上的多个记录匹配,则可能会多次列出相同的ID。



 类似资料:
  • 问题内容: 我有一个简单的表,其中包含一些虚拟数据设置: 我可以通过执行以下sql(MSSQL 2008)语句来选择运行总计: 这将给我如下结果: 现在可以只为每个用户检索最新的行吗?因此结果将是: 我要这样做正确吗?任何建议或遵循的新路径都将是很棒的! 问题答案: 试试这个: SQL小提琴演示

  • 问题内容: 我有下表 我需要编写一个查询,该查询将返回不同的ID和对应的Number列值相乘。对于给定的表结果应该是这样的 (不使用游标) 问题答案: 这将适用于正数,也可以乘以负数,也可以使用ABS()函数使用绝对(正)值,但最终结果将是正数,而不是负数: 编辑:添加了测试脚本 输出:

  • 问题内容: 我想使用此查询中的值进行更新,但这意味着它返回多个值。 消息512,级别16,状态1,行1 子查询返回的值大于1。当子查询遵循=,!=,<,<=,>,> =或将子查询用作表达式时,不允许这样做。 它如何返回不止一列? 问题答案: 如果此查询返回所需的信息: 然后,这可能是您想要的UPDATE查询: 我必须同意戈登的观点,您的分组似乎很奇怪。我不确定我是否正确(这就是为什么我强烈建议您先

  • 问题内容: 我想在日期基础上更新一行。问题是,由于我的错误,我有两行相同的数据。如何仅在一行上运行更新? 问题答案: 表通常具有唯一的ID。您应该对此进行过滤。 例如, 如果您的表没有唯一的ID,请考虑添加一个:带有和的列。

  • 问题内容: 我有一组一对一的映射A->苹果,B->香蕉,等等。我的表中有一列的值为A,B,C。 现在,我正在尝试使用选择语句,这将给我直接结果 但是我没有得到正确的结果,请帮助我。 问题答案: 这只是case语句的语法,看起来像这样。 提醒一下;不执行赋值,该值成为列内容。(如果您想将其分配给变量,则可以将其放在CASE语句之前)。

  • 问题内容: 我正在尝试对此表进行查询: 我想获得输出: 我想得到那个结果,所以我会知道什么时候开始赚钱,什么时候停止钱。我还对开始花钱之前的月份数(这解释了第一行)以及停止钱的月份数(这解释了为什么我也对2013年7月至2013年8月的第三行感兴趣)感兴趣。 )。 我知道我可以在日期上使用min和max,在金额上使用sum,但是我不知道如何以这种方式划分记录。 谢谢! 问题答案: 这是一个主意(和