代码之家  ›  专栏  ›  技术社区  ›  Nate Pet

如果子查询检索多个记录,则分配null。如何做到这一点?

  •  1
  • Nate Pet  · 技术社区  · 9 年前

    我有以下问题。为了演示,我简化了它。我正在使用SQL Server-t-SQL

     Select tm.LocID  = (select  LocID from tblLoc tl
                         where tl.LocID = tm.LodID )
     from tblMain tm
    

    如果子查询返回多条记录,我希望分配tm。如果只有1条记录返回,则将LocID设置为null,然后将其分配给tm.LocID。我正在寻找一种简单的方法来做到这一点。如有任何帮助,将不胜感激。

    我可以看到的一种方法是使用CASE语句,并检查(Count*>1)是否赋值为null,否则返回值,但这需要在select语句中使用select语句。

    3 回复  |  直到 9 年前
        1
  •  0
  •   Mureinik    9 年前

    关于使用 case 表达式 count(*) ,但不需要另一个子查询:

    SELECT tm.LocID  = (SELECT CASE COUNT(*) WHEN 1 THEN MAX(LocID) END
                         FROM   tblLoc tl
                         WHERE  tl.LocID = tm.LodID )
    FROM   tblMain tm
    
        2
  •  0
  •   Beth    9 年前

    或者使用 HAVING 子句,如

    Select tm.LocID  = (select  LocID from tblLoc tl
                        where tl.LocID = tm.LodID
                         group by locID
                         having count(*) = 1)
     )
     from tblMain tm
    
        3
  •  0
  •   Jordan Parmer    9 年前

    上面的问题(以及这里的许多其他答案)是 相关的,相关的 子查询,这将非常慢,因为它对每个记录执行单独的聚合查询。以下内容将解决您的问题和 潜在地 由于计数发生在一次传递中,因此性能稍好一些。

    SELECT
      CASE 
        WHEN x.locid IS NOT NULL THEN x.locid
        ELSE NULL
      END 
    FROM tblMain m
    LEFT JOIN (
      SELECT
        locid
      FROM tblLoc 
      GROUP BY locid
      HAVING COUNT(1) = 1
    ) x
       ON x.locid = m.locid
    ;
    

    以上是Postgres语法(我很熟悉),因此您必须使其与TSQL兼容。