如果子查询检索多个记录,则指定null。怎么做到呢?

时间:2015-09-18 20:27:39

标签: sql sql-server

我有以下查询。我将其简化为演示目的。我正在使用SQL Server - t-sql

func GetCase() {

let RNumber = Int(arc4random_uniform(9)+1)

   if categoria == 1 {
    }
}

如果子查询返回多个记录,我喜欢将tm.LocID分配给null,如果只返回了1个记录,则将其分配给tm.LocID。我正在寻找一种简单的方法来做到这一点。任何帮助,将不胜感激。

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

3 个答案:

答案 0 :(得分:0)

上面的查询(以及此处的许多其他答案)是一个相关的子查询,由于它对每条记录执行单独的聚合查询,因此速度非常慢。以下内容将解决您的问题并且可能执行得更好,因为计数一次性发生。

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兼容。

答案 1 :(得分:0)

您对class FirstErrorHandler: UIAlertViewDelegate { init() { let errorAlert: UIAlertView = UIAlertView() errorAlert.delegate = self errorAlert.message = "Are you sure?" errorAlert.addButtonWithTitle("Yes") errorAlert.addButtonWithTitle("No") errorAlert.show() } func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { // handle first kind of errors } } class SecondErrorHandler: UIAlertViewDelegate { init() { ... } func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { // handle another kind of errors } } class MyViewController { var alertHandler: UIAlertViewDelegate! // store strong reference to alert handler ... func showSomeError() { self.alertHandler = FirstErrorHandler() ... } } 使用case表达式有正确的想法,但它不需要另一个子查询:

count(*)

答案 2 :(得分:0)

或只使用HAVING条款,例如

Select tm.LocID  = (select  LocID from tblLoc tl
                    where tl.LocID = tm.LodID
                     group by locID
                     having count(*) = 1)
 )
 from tblMain tm