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

这两个查询是否相同-GROUP BY与DISTINCT?

漆雕绍晖
2023-03-14
问题内容

这两个查询似乎返回相同的结果。那是巧合还是真的一样?

1。

SELECT t.ItemNumber,
  (SELECT TOP 1 ItemDescription
   FROM Transactions
   WHERE ItemNumber = t.ItemNumber
   ORDER BY DateCreated DESC) AS ItemDescription
FROM Transactions t
GROUP BY t.ItemNumber

2。

SELECT DISTINCT(t.ItemNumber),
  (SELECT TOP 1 ItemDescription
   FROM Transactions
   WHERE ItemNumber = t.ItemNumber
   ORDER BY DateCreated DESC) AS ItemDescription
FROM Transactions t

有点解释:我试图从充满交易的表中获得不同的项目清单。对于每个项目,我正在寻找ItemNumber(标识字段)和最新的ItemDescription。


问题答案:

您的示例#2让我挠了一下头-我对自己说:“您不能发表DISTINCT任何专栏,那意味着什么?” -直到我意识到发生了什么。

当你有

SELECT DISTINCT(t.ItemNumber)

你是 不是 ,尽管外表,实际上需要的不同值 t.ItemNumber!您的示例#2实际上被解析为与

SELECT DISTINCT
  (t.ItemNumber)
  ,
  (SELECT TOP 1 ItemDescription
   FROM Transactions
   WHERE ItemNumber = t.ItemNumber
   ORDER BY DateCreated DESC) AS ItemDescription
FROM Transactions t

在句法上正确但周围多余的括号t.ItemNumber。它DISTINCT适用于整个结果集。

在这种情况下,由于GROUP BY按列分组的组实际上有所不同,因此您将获得相同的结果。我实际上对SQL Server不(在GROUP BY示例中)坚持要在GROUP BY列表中提到子查询列感到有些惊讶。



 类似资料:
  • 问题内容: 和 第二个代码产生了一个空指针异常,该怎么做才能使下一个等效? 问题答案: 我可以看到,如果players某个自定义java.lang.Iterable的get()实现的实现被破坏,或者至少以一种异常的方式(与的行为不同),就会发生这种情况。 除此之外,我唯一能想到的就是您未在代码中向我们展示的某些内容导致了某些错误。 如果执行此操作会怎样?

  • 假设我有一组数组,包括和,我想检查它们是否相等。一般来说,我可以只使用(除了一些我现在忽略的愚蠢的情况)。 但是,这会计算的整个数组,这通常是不需要的。我的数组非常大,而且我有很多数组,两个数组相等的概率很小,所以很可能,在函数返回False之前,我只需要计算的一小部分,所以这对我来说不是一个最佳解决方案。 我尝试使用内置的函数,并结合: 然而,在两个数组相等的情况下,这似乎要慢得多,总的来说,它

  • 有人问这两者是否相同,我更喜欢哪一个。我告诉他他们是一样的,但他似乎对答案不满意。那么,它们是不同的还是相同的,你更喜欢哪一个?

  • 嗨,我正在尝试解决Udemy练习:编写一个名为hasSharedDigit的方法,其中包含int类型的两个参数。 每个数字应在10(含)-99(含)之间。如果其中一个数字不在范围内,则该方法应返回false。 如果两个数字中都有数字,例如12和23中的2,则该方法应返回true;否则,该方法应返回false。 我一直在得到真实,而有共享数字(9,99)我无法发现为什么.. }

  • 我有两个arraylist。employee类和user类的ArrayList。employee类将name、age、address作为字段。用户类将名称、年龄、地址作为字段。下面是两个列表 要检查用户是否和员工的地址相同。如果用户没有地址,则从员工处复制。

  • 问题内容: 我收到了2个轮廓(和)。我怎么知道它们是否相交?我不需要坐标,我只需要一个布尔值或。 我尝试了不同的方式,并且已经尝试与 …但是得到的错误是数组没有方法“ Area()” 问题答案: 一旦有了的两个轮廓,就可以使用按位运算来检测相交。具体来说,我们可以使用。想法是为每个轮廓创建两个单独的图像,然后对它们使用逻辑运算。具有正值(或)的任何点都将是交点。因此,由于您只想获取是否存在相交的布