【问题标题】:How do I add a column derived from a select statement within a select statement?如何在 select 语句中添加从 select 语句派生的列?
【发布时间】:2013-09-17 06:42:04
【问题描述】:

使用 SQL Server 2008

目的:从table1中选择一系列列插入到table2中

问题:在 table2 中需要插入一个额外的列,该列可以从 table1 和 table 3 之间的连接派生出来

当前代码

SELECT
    table1.name,
    table1.email,
    table1.phone,
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId,
    (SELECT
        table3.UserID AS ParentID
     FROM
         table3
     INNER JOIN
         table1 ON
         table3.ID = table1.table3_ID)
FROM
    table1
WHERE
    table1.group_id = 3 AND
    table1.status = 'active'

目前此代码不起作用并返回“子查询返回超过 1 个值”错误。 我知道这可能不是使用嵌套选择的正确方法,正确的方法是什么?

如有必要,可以提供其他数据。 先感谢您。

【问题讨论】:

  • 有什么原因不能在 from 子句中加入 table1 和 table3 吗?
  • 谢谢你所有的答案都是好的,我使用的是我检查过的。我会全部投票,但我没有代表
  • 关于这个问题的更多信息,以防万一有人好奇......使用 TOP x,我能够意识到有重复输入到表中以某种方式导致了问题。快速 COUNT 和 GROUP BY 显示重复的 ID

标签: sql sql-server select insert


【解决方案1】:

如果您真的(真的真的)想使用subquery 而不是join,那么您的代码就很好。您应该如下更改子查询的join

SELECT
    table1.name,
    table1.email,
    table1.phone,
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId,
    (SELECT
        table3.UserID 
     FROM
         table3
     WHERE
         table3.ID = table1.table3_ID) AS ParentID
FROM
    table1
WHERE
    table1.group_id = 3 AND
    table1.status = 'active'

除此之外,我在subquery 之外添加了一个别名ParentID


请考虑以下带有表别名的代码。使用它是个好习惯,因为代码更具可读性。

SELECT
    t1.name,
    t1.email,
    t1.phone,
    CASE WHEN t1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN t1.group_id = 3 THEN 5 ELSE t1.group_id END AS RoleId,
    (SELECT
        table3.UserID 
     FROM
         table3 t3
     WHERE
         t3.ID = t1.table3_ID) AS ParentID
FROM
    table1 t1
WHERE
    t1.group_id = 3 AND
    t1.status = 'active'

【讨论】:

    【解决方案2】:

    您可以通过将 TOP 1 添加到 select 的“select .. from table”部分来解决多于 1 个值的错误。但内部加入它们可能更容易。

    SELECT
    table1.name,
    table1.email,
    table1.phone,
    CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END AS Active,
    CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END AS RoleId,
    table3.UserID
    FROM    table1
    INNER JOIN table3 ON
         table3.ID = table1.table3_ID
    WHERE
    table1.group_id = 3 AND
    table1.status = 'active'
    

    【讨论】:

      【解决方案3】:

      问题是您需要一个相关的子查询。这意味着您需要从子查询中删除table1

      SELECT table1.name, table1.email, table1.phone,
             (CASE WHEN table1.status = 'active' THEN 1 ELSE 0 END) AS Active,
             (CASE WHEN table1.group_id = 3 THEN 5 ELSE table1.group_id END) AS RoleId,
             (SELECT table3.UserID 
              FROM table3
              WHERE table3.ID = table1.table3_ID
             ) as ParentID
      FROM table1
      WHERE table1.group_id = 3 AND table1.status = 'active';
      

      如果table3 中有多个可能的匹配项,那么您将需要select top 1 table3.UserIdselect max(table3.UserId) 之类的内容。

      【讨论】:

        猜你喜欢
        • 2022-01-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-28
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 2017-01-15
        相关资源
        最近更新 更多