【问题标题】:SQL Sub Query to find duplicates用于查找重复项的 SQL 子查询
【发布时间】:2014-02-04 22:53:45
【问题描述】:

我正在尝试创建一个查询来查找表中的重复项。然后我想知道有关重复项的详细信息。我想我需要为此使用子查询,但我很难理解我需要做什么。

例如,这个查询产生了我的重复:

SELECT [BINLOCATION], COUNT(*) as counted
FROM [MAS_RDP].[dbo].[IM_ITEMWAREHOUSE]
where QUANTITYONHAND > '0' 
group by BINLOCATION
having COUNT(*) > '1'

知道我想知道这些结果的详细信息。

IE:

SELECT ITEMCODE, BINLOCATION 
FROM IM_ITEMWAREHOUSE where BINLOCATION = (
  SELECT [BINLOCATION], COUNT(*) as counted
  FROM [MAS_RDP].[dbo].[IM_ITEMWAREHOUSE]
  where QUANTITYONHAND > '0'
  group by BINLOCATION
  having COUNT(*) > '1')

但这会产生结果: 当子查询不使用 EXISTS 引入时,选择列表中只能指定一个表达式。

【问题讨论】:

    标签: sql-server subquery


    【解决方案1】:

    在大多数数据库中执行此查询的更好方法是使用count(*) 窗口函数:

    select t.*
    from (SELECT iw.*, COUNT(*) over (partition by binlocation) as cnt
          FROM [MAS_RDP].[dbo].[IM_ITEMWAREHOUSE]
          where QUANTITYONHAND > '0'
         ) t
    where cnt > 1;
    

    【讨论】:

      【解决方案2】:

      只需从选择列表中删除COUNT(*) 并将BINLOCATION = (... 更改为BINLOCATION IN (...

      SELECT ITEMCODE, BINLOCATION 
      FROM IM_ITEMWAREHOUSE where BINLOCATION IN (
        SELECT [BINLOCATION]
        FROM [MAS_RDP].[dbo].[IM_ITEMWAREHOUSE]
        where QUANTITYONHAND > '0'
        group by BINLOCATION
        having COUNT(*) > '1')
      

      【讨论】:

      • 知道了,谢谢!!
      【解决方案3】:

      您不能在子查询中返回两列来在 WHERE 子句中进行比较。作为一种解决方案,您可以将 ITEMCODE 和 BINLOCATION 像 ITEMCODE-BINLOCATION 与 sql 代码连接起来。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-31
        • 1970-01-01
        • 2017-10-10
        • 1970-01-01
        • 2016-09-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多