使用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”错误。 我知道这可能不是使用嵌套选择的正确方法,这样做的正确方法是什么?
如有必要,可提供其他数据。 先感谢您。
答案 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.UserId
或select max(table3.UserId)
之类的内容。