我想从下图中创建以下输出:
输入数据来自视图(Select * from test
)。目标是获取progress
列包含文本tbd
且counter
数字为1的所有数据。
这可以用语句解决吗?
由于sqlfiddle不在这里,所以是架构:
CREATE TABLE test
(
[ID] [int] NOT NULL,
[Counter] [int] NOT NULL,
[Name] nvarchar(200) NULL,
[Progress] nvarchar(200) NOT NULL
)
INSERT INTO test
VALUES (1, 1, 'userA', 'tbd'),
(1, 2, 'userB', 'done'),
(1, 3, 'userC', 'tbd'),
(2, 1, 'userB', 'done'),
(2, 5, 'userA', 'tbd'),
(3, 1, 'userD', 'tbd'),
(3, 2, 'userA', 'done'),
(3, 7, 'userC', 'tbd'),
(3, 11, 'userB', 'tbd')
我无法让它发挥作用。
希望你能帮助我。
非常感谢。
答案 0 :(得分:2)
使用Exists
子句可以达到理想的效果。
<强>查询强>
SELECT
*
FROM test t
WHERE EXISTS (SELECT 1 FROM test
WHERE t.ID = ID
AND progress = 'tbd'
AND counter = 1)
<强>结果强>
ID Counter Name Progress
-----------------------------
1 1 userA tbd
1 2 userB done
1 3 userC tbd
3 1 userD tbd
3 2 userA done
3 7 userC tbd
3 11 userB tbd
另一个替代解决方案很简单SELF JOIN
就像这样 -
<强>查询强>
SELECT
le.ID, le.Counter, le.Name, le.Progress
FROM test le
INNER JOIN test re ON le.ID = re.ID
WHERE re.progress = 'tbd'
AND re.counter = 1
以上查询返回相同的结果。
答案 1 :(得分:1)
只需尝试:
select * from test where progress = 'tbd' and counter = 1
答案 2 :(得分:1)
也许这会对你有所帮助:
select *,
row_number() over(partition by Progress order by Counter)
rowID
into #tmp
from Test
select *
from #tmp
where ID in(
select ID
from #tmp
where Counter = 1
and Progress = 'tbd'
)
order by ID,
rowID