SQL Update子查询返回多个值 -

时间:2016-12-21 03:39:08

标签: sql sql-server

我试图运行以下代码:

UPDATE Personnel 
SET TrID        =   (SELECT tp.personID FROM [*******].dbo.tblPerson tp WHERE tp.PersonnelID = PersonnelId)

当我运行它时,我收到错误:

  

Msg 512,Level 16,State 1,Line 3 Subquery返回的值超过1   值。当子查询遵循=,!=,<,< =,

时,不允许这样做      
    

,> =或当子查询用作表达式时。声明已经终止。

  

然而,当我运行以下

SELECT COUNT(tp.personID)
FROM [*******].dbo.tblPerson tp
WHERE tp.PersonnelID = PersonnelId
GROUP BY tp.PersonID
HAVING COUNT(tp.personID) > 1

我得到0结果所以我很困惑为什么我得到这个错误。

提前致谢

1 个答案:

答案 0 :(得分:0)

运行:

class ViewController: UIViewController {

@IBOutlet weak var tableView: UITableView!
@IBOutlet weak var addBarButtonItem: UIBarButtonItem!

var managedObjectContext: NSManagedObjectContext!

let disposeBag = DisposeBag()

override func viewDidLoad() {
    super.viewDidLoad()

    bindUI()
    configureTableView()

}

func bindUI() {

    addBarButtonItem.rx.tap
        .map { _ in
            Event(id: "1", date: Date(timeIntervalSince1970: 0))
    /* Change   Date(timeIntervalSince1970: 1)   */
        }.subscribe(onNext: { [weak self] (event) in
            _ = try? self?.managedObjectContext.rx.update(event)
        })
        .addDisposableTo(disposeBag)

}

func configureTableView() {

    tableView.isEditing = true

let animatedDataSource = RxTableViewSectionedAnimatedDataSource<AnimatableSectionModel<String, Event>>()

animatedDataSource.configureCell = { dateSource, tableView, indexPath, event in
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
    cell.textLabel?.text = "\(event.date)"
    print("\(event.date)")
    return cell
}

managedObjectContext.rx.entities(Event.self, sortDescriptors:[NSSortDescriptor(key: "date", ascending: false)])
        .map { events in

[AnimatableSectionModel(model: "Section 1", items: events)]

}
.bindTo(tableView.rx.items(dataSource: animatedDataSource))
.addDisposableTo(disposeBag)
  }
}

要解决您的问题,您需要选择其中一个值。一种方法使用SELECT PersonnelID, COUNT(*) FROM [*******].dbo.tblPerson tp GROUP BY PersonnelID HAVING COUNT(*) > 1; 。我建议你也加一个SELECT TOP 1

编辑:

问题似乎是你的语法。使用相关子查询时,始终限定所有列名以避免错误:

ORDER BY

你有:

UPDATE Personnel 
    SET TrID = (SELECT tp.personID
                FROM [*******].dbo.tblPerson tp
                WHERE tp.PersonnelID = Personnel.PersonnelId
               );

SQL的作用域规则将其评估为:

                WHERE tp.PersonnelID = PersonnelId

每个非 WHERE tp.PersonnelID = tp.PersonnelId NULL匹配 - 因此多行错误。