【问题标题】:SQL Repeat primary key row in the select statement without using union all functionSQL在select语句中重复主键行而不使用union all函数
【发布时间】:2019-08-11 06:22:59
【问题描述】:

我想从表中选择具有主键列的记录。但我希望根据查询的动态输入重复记录主键。

假设我有包含两列的员工表:(emp_id (primary key), emp_name);

emp_id   name
 1       abc 
 2       xy
 3       xyz

假设我正在从 emp 表中选择记录,例如。

Select * from emp where emp_id in (1,2,2,3);

将从表中返回三行。
我想从表中检索 4 行而不是 3 行。

查询也应该适用于其他输入,例如:

Select * from emp where emp_id in (1,1,1,2,2,3,3,3,3);

那时我也应该从表中返回 9 行。

我已经尝试使用union all 函数来检索记录。
但union all 将是一个静态解决方案。

【问题讨论】:

标签: sql sql-server sql-server-2016


【解决方案1】:

如果要保证结果集的顺序,则需要在value() 子句中包含该信息:

select v.id, e.* 
from (values (1, 1), (2, 1), (3, 1), (4, 2),
             (5, 2), (6, 3), (7, 3), (8, 3), (9, 3)
     ) v(ord, id) left join
     emp e
     on e.emp_id = v.id
order by v.ord;

注意事项:

  • 对于 values 子句,您不需要子查询或 CTE。这似乎是多余的。
  • left join 确保准确的行在结果集中即使没有匹配项。因此,它包含派生表中的 id。
  • 需要order by 来保证订购。

【讨论】:

  • @@Gordon Linoff 谢谢
【解决方案2】:

使用VALUES 创建数据集并将其加入表中:

with cte as (
  select * from
  (values (1),(1),(1),(2),(2),(3),(3),(3),(3)) as t(id)
)
select e.* 
from cte c inner join emp e
on e.emp_id = c.id

请参阅demo。
结果:

> emp_id | name
> -----: | :---
>      1 | abc 
>      1 | abc 
>      1 | abc 
>      2 | xy  
>      2 | xy  
>      3 | xyz 
>      3 | xyz 
>      3 | xyz 
>      3 | xyz 

【讨论】:

  • 非常感谢,它工作正常。你是个天才。
  • @JaypalSodha 你得到的答案是正确的。看演示:dbfiddle.uk/…这不是你想要的吗?
  • 是的,它工作正常,我想在我的编辑器中编写查询时出错。非常感谢你们,你们太棒了。
【解决方案3】:

您也可以尝试此操作,因为您提到您使用的是 SQL Server 版本 2016(需要 130 的兼容级别)-

SELECT * FROM
(
    SELECT value 
    FROM STRING_SPLIT('1,2,2,3', ',')
)A
LEFT JOIN your_table B ON A.value = B.emp_id

您可以查看DEMO HERE

【讨论】:

  • 你能帮我解决这个问题吗,stackoverflow.com/q/57482171/5874233
  • 好的,我正在检查。
  • @JaypalSodha 我已经在该问题中发布了答案。请检查。
  • 它工作正常,先生,非常感谢您的帮助。 :)
  • @JaypalSodha 不客气。请接受该答案并投反对票:)
猜你喜欢
  • 2013-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多