Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL选择具有相同列值的完整行_Sql_Sql Server - Fatal编程技术网

T-SQL选择具有相同列值的完整行

T-SQL选择具有相同列值的完整行,sql,sql-server,Sql,Sql Server,我想显示另一行中存在序列号的所有行 SELECT D1.[ID] ,D1.[UUID] ,D1.[Serial] FROM [x].[dbo].[Devices] D1 JOIN ( SELECT [Serial] FROM [x].[dbo].[Devices] GROUP BY Serial HAVING COUNT(*) > 1 ) D2 ON D1.[Serial] = D2.[Serial] 如

我想显示另一行中存在序列号的所有行

SELECT  D1.[ID]
        ,D1.[UUID]
        ,D1.[Serial]
FROM [x].[dbo].[Devices] D1
JOIN (  SELECT [Serial]
        FROM [x].[dbo].[Devices]
        GROUP BY Serial
        HAVING COUNT(*) > 1 ) D2 ON D1.[Serial] = D2.[Serial]
如果我真的喜欢它的工作

SELECT 
      [Serial]
FROM [x].[dbo].[Devices]
GROUP BY Serial
HAVING COUNT(*) > 1
但是当我添加更多的select列时

SELECT [ID]
      ,[UUID]
      ,[Serial]
FROM [x].[dbo].[Devices]
GROUP BY Serial
HAVING COUNT(*) > 1
我明白了

“ID”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

为什么我不能选择更多的列


我应该如何显示整行?

只要ID和UUID对于序列是唯一的,就尝试按所有列分组

SELECT [ID]
  ,[UUID]
  ,[Serial]
FROM [x].[dbo].[Devices]
GROUP BY Serial
  ,[ID]
  ,[UUID]
HAVING COUNT(*) > 1

只要ID和UUID对于序列是唯一的,就可以尝试按所有列进行分组

SELECT [ID]
  ,[UUID]
  ,[Serial]
FROM [x].[dbo].[Devices]
GROUP BY Serial
  ,[ID]
  ,[UUID]
HAVING COUNT(*) > 1

希望您需要此查询,它将显示其他行中存在的具有序列号的所有行

SELECT  D1.[ID]
        ,D1.[UUID]
        ,D1.[Serial]
FROM [x].[dbo].[Devices] D1
JOIN (  SELECT [Serial]
        FROM [x].[dbo].[Devices]
        GROUP BY Serial
        HAVING COUNT(*) > 1 ) D2 ON D1.[Serial] = D2.[Serial]

希望您需要此查询,它将显示其他行中存在的具有序列号的所有行

SELECT  D1.[ID]
        ,D1.[UUID]
        ,D1.[Serial]
FROM [x].[dbo].[Devices] D1
JOIN (  SELECT [Serial]
        FROM [x].[dbo].[Devices]
        GROUP BY Serial
        HAVING COUNT(*) > 1 ) D2 ON D1.[Serial] = D2.[Serial]

您可以使用窗口功能执行此操作:

select *
from (
   select *, 
          count(*) over (partition by [Serial]) as serial_count
   from [x].[dbo].[Devices]
)  t
where serial_count > 1;

这通常比使用聚合连接到子选择更快。

您可以使用窗口功能执行此操作:

select *
from (
   select *, 
          count(*) over (partition by [Serial]) as serial_count
   from [x].[dbo].[Devices]
)  t
where serial_count > 1;

这通常比使用聚合连接到子选择更快。

您能用一些示例数据解释并显示预期结果吗?我们的错误是因为您只按
序列进行分组,但选择了3个列,其中2个列未在分组中指定或具有聚合函数。您能用一些示例数据解释吗示例数据和显示预期结果您的错误是因为您仅按
Serial
分组,但选择了3个列,其中2个列未在分组中指定或具有聚合函数。这将给出0行,而仅选择Serial和grouping by Serial将给出940行。在这种情况下,我只能假设对于每个序列,您有许多ID和UUID。ID是唯一的,但UUID不是。但我不能简单地将许多值分组,而只在序列上筛选其他行中具有相同值的值吗?@Arulkumar在上面告诉了我。继续:)这将给出0行,而仅选择serial并按serial分组将给出940在这种情况下,我只能假设对于每个serial,您都有许多ID,UUID.ID是唯一的,但UUID不是唯一的。但我不能简单地将许多值分组,而只在序列上筛选其他行中具有相同值的值吗?@Arulkumar在上面告诉了我。随你说:)