【问题标题】:SQL Server subqueries errorSQL Server 子查询错误
【发布时间】:2018-02-03 18:35:27
【问题描述】:

我的查询需要一点帮助。我是子查询的新手。我想替换表中姓氏列中没有姓氏的空值的每一行,并输出所有没有姓氏的值。我收到一个错误,我不知道如何解决这个问题。将不胜感激任何帮助。

SELECT
    Firstname, 
    ISNULL(dbo.Mechanics.LastName, 'No lastname') AS Lastname
FROM   
    dbo.Mechanics
WHERE  
    Lastname = (SELECT FirstName, Lastname 
                FROM Mechanics 
                WHERE LastName = 'No lastname');

我收到此错误:

消息 116,第 16 级,状态 1,第 4 行
不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式

【问题讨论】:

  • 你可能想要WHERE Lastname IS NULL
  • 仅供参考:错误消息是由于从子查询返回两列 FirstNameLastName 造成的。仅支持单个表达式。如果你可以有多个表达式,... where LastName = FirstName, LastName 意味着什么?

标签: sql sql-server tsql subquery


【解决方案1】:

不确定此处是否需要子查询。试试这个:

SELECT 
       Firstname, 'No Lastname' AS Lastname
FROM   Dbo.Mechanics
WHERE Lastname IS NULL ;     

【讨论】:

    【解决方案2】:
        SELECT  m.Firstname ,
                ISNULL(m.LastName, 'No lastname') AS Lastname
        FROM    dbo.Mechanics M
        WHERE   EXISTS ( SELECT 1
                         FROM   Mechanics M1
                         WHERE  m1.LastName = 'No lastname'
                                AND m.LastName = m1.LastName )
    

    【讨论】:

      【解决方案3】:

      我看不出子查询与此有什么关系。这应该足够了:

      SELECT m.Firstname, COALESCE(m.LastName, 'No lastname') AS Lastname
      FROM Dbo.Mechanics m
      WHERE m.Lastname IS NULL;
      

      您还应该学习如何使用表别名,以便您的查询更易于编写和阅读。

      【讨论】:

        【解决方案4】:

        我想替换表中姓氏列中没有姓氏的空值的每一行

        这是通过UPDATE 语句完成的:

        UPDATE Dbo.Mechanics SET LastName = 'No lastname' WHERE LastName IS NULL
        

        同时输出所有没有姓氏的值

        那么,选择就很简单了:

        SELECT FirstName, LastName FROM Dbo.Mechanics WHERE LastName = 'No lastname'
        

        【讨论】:

          【解决方案5】:

          你没有两个写任何子查询,因为你可以先更新表,其中列为空

          UPDATE dbo.Mechanics SET LastName ='No Lastname' WHERE LastName IS NULL
          

          然后使用带有 WHERE 子句的 SELECT 语句将 LastName 等同于 'No Lastname'

          SELECT FirstName,LastName FROM dbo.Mechanics WHERE LastName = 'No Lastname'
          

          编辑: 根据您的评论,您不想永久更新 LastName 列而不是使用COALESCE

          SELECT FirstName,COALESCE(LastName, 'No lastname') AS LastName FROM dbo.Mechanics WHERE LastName IS NULL
          

          【讨论】:

          • 感谢您的回复。我不想永久更新表格。我只想通过选择查询输出该结果。不过感谢您的帮助。
          【解决方案6】:

          如果您想要 UPDATE 表数据并查看更新的记录您可以使用 OUTPUT 子句输出查询结果: https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql

          查询应该是:

          UPDATE Mechanics
          SET LastName = 'No lastname' 
          FROM Mechanics WHERE LastName IS NULL
          OUTPUT inserted.*
          

          如果您想选择所有姓氏更正的数据:

          SELECT FirstName, ISNULL(LastName, 'No lastname') AS LastName FROM dbo.Mechanics
          

          COALESCE 函数(多个参数)比 ISNULL 函数(只有 2 个参数)慢一点

          【讨论】:

            猜你喜欢
            • 2014-01-03
            • 2015-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-01-29
            • 1970-01-01
            相关资源
            最近更新 更多