如何在select语句中添加从select语句派生的列?

时间:2013-09-12 18:24:13

标签: sql sql-server select insert

使用SQL Server 2008

目标:从table1中选择一系列列以插入table2

问题:在table2中,需要插入一个可以从table1和table3之间的连接派生的其他列

当前代码

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'

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

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

3 个答案:

答案 0 :(得分: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'

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


请使用表别名考虑以下代码。使用它是一种很好的做法,因为代码更具可读性。

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'

答案 1 :(得分:1)

你可以通过将一个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'

答案 2 :(得分:1)

问题是你想要一个相关的子查询。这意味着您需要从子查询中删除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)之类的内容。