Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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
Sql 确定特定列上重复的表项数的最佳方法_Sql_Sql Server_Performance_Tsql_Azure Sql Database - Fatal编程技术网

Sql 确定特定列上重复的表项数的最佳方法

Sql 确定特定列上重复的表项数的最佳方法,sql,sql-server,performance,tsql,azure-sql-database,Sql,Sql Server,Performance,Tsql,Azure Sql Database,我需要确定特定表行在特定列上是否唯一。目前,我正在使用如下子查询执行此操作: SELECT t1.ID, (SELECT COUNT(*) FROM MyTable AS t2 WHERE (t2.FirstName = t1.FirstName) AND (t2.Surname = t1.Surname) ) AS cnt FROM MyTable AS t1 WHERE t1.ID IN (100, 101, 102); 这很好用。然

我需要确定特定表行在特定列上是否唯一。目前,我正在使用如下子查询执行此操作:

SELECT
    t1.ID,
    (SELECT COUNT(*)
        FROM MyTable AS t2
        WHERE (t2.FirstName = t1.FirstName) AND (t2.Surname = t1.Surname)
    ) AS cnt
FROM MyTable AS t1
WHERE t1.ID IN (100, 101, 102);
这很好用。然而,我想知道是否有人知道一种比使用子查询更有效的方法来实现相同的结果


顺便说一句,我正在Azure SQL Server上执行此操作。

您可以通过以下方式使用组:

SELECT
    t1.FirstName,
    t1.Surname,
    COUNT(t1.ID) as cnt
FROM MyTable AS t1
WHERE t1.ID IN (100, 101, 102)
GROUP BY t1.FirstName, t1.Surname
ORDER BY cnt DESC
如果只想筛选复制副本,可以在GROUP BY子句之后添加HAVING cnt>1

但是,这取决于您是否也需要ID列,如果需要,则可能必须使用子查询

在这里,您可以找到有关该主题的更多信息:

您可以通过以下方式使用组:

SELECT
    t1.FirstName,
    t1.Surname,
    COUNT(t1.ID) as cnt
FROM MyTable AS t1
WHERE t1.ID IN (100, 101, 102)
GROUP BY t1.FirstName, t1.Surname
ORDER BY cnt DESC
如果只想筛选复制副本,可以在GROUP BY子句之后添加HAVING cnt>1

但是,这取决于您是否也需要ID列,如果需要,则可能必须使用子查询

在这里,您可以找到有关该主题的更多信息:

我不知道这与您环境中的查询相比会有什么不同,但我希望它的性能会更好:

Select id, qty
From mytable
Inner join
(
    Select firstname, surname, count(0) as qty
    From mytable
    Group by firstname, surname
) as qtytable
On mytable.firstname = qtytable.firstname  and mytable.surname = qtytable.surname

我不知道这将如何与您环境中的查询进行比较,但我希望这会表现得更好:

Select id, qty
From mytable
Inner join
(
    Select firstname, surname, count(0) as qty
    From mytable
    Group by firstname, surname
) as qtytable
On mytable.firstname = qtytable.firstname  and mytable.surname = qtytable.surname

有点极端,但由于需要在(100101102)中使用两次,然后创建#temp

亚历山大的解决方案可能更好

当然,它的代码更少,有点极端,但因为需要在(100101102)中使用两次,然后创建#temp

亚历山大的解决方案可能更好

当然它的代码更少

我认为更有效的方法是使用COUNT函数和OVER子句或行数排序函数

SELECT ID, COUNT(*) OVER(PARTITION BY FirstName, Surname) AS cnt
FROM MyTable
WHERE ID IN (100, 101, 102)

ROW_NUMBER返回分区内行的序列号 对于结果集,从每个分区中第一行的1开始


我认为更有效的方法是使用带有OVER子句的COUNT函数或ROW_NUMBER排序函数

SELECT ID, COUNT(*) OVER(PARTITION BY FirstName, Surname) AS cnt
FROM MyTable
WHERE ID IN (100, 101, 102)

ROW_NUMBER返回分区内行的序列号 对于结果集,从每个分区中第一行的1开始


OP确实说了相同的结果OP确实说了相同的结果不幸的是,我得到了错误“OVER SQL构造或语句不受支持”。看起来Azure SQL Server不支持OVER。很抱歉,没有指定我正在使用Azure SQL。我已更新了我的问题以指定该问题。不幸的是,我收到错误“不支持OVER SQL构造或语句”。Azure SQL Server似乎不支持OVER。很抱歉,没有指定我正在使用Azure SQL。我已经更新了我的问题来说明这一点。