我有两个名为TEST和STEPS的表,它们与Test-Id列相关。
我可以通过以下方式进行连接来获取所有必需的列。
select t.id,t.name,s.step_no,s.step_data
from test t,steps s
where t.id = s.testid
我需要的是,除了列之外,我还需要每场比赛的总行数。
小提琴:http://sqlfiddle.com/#!6/794508/1
当前输出:
ID NAME STEP_NO STEP_DATA
-- ---- ------- ---------
1 TC1 1 Step 1
1 TC1 2 Step 2
1 TC1 3 Step 3
2 TC2 1 Step 1
必填项:
ID NAME STEP_NO STEP_DATA COUNT
-- ---- ------- --------- -----
1 TC1 1 Step 1 3
1 TC1 2 Step 2 3
1 TC1 3 Step 3 3
2 TC2 1 Step 1 1
其中count是TEST表中每个Id的STEPS表中的总行数。
如果您需要任何信息,请与我们联系。
答案 0 :(得分:2)
您只需在查询中添加count(*) over ...
:
SELECT
t.id,
t.name,
s.step_no,
s.step_data,
[count] = COUNT(*) OVER (PARTITION BY s.testid)
FROM
test t,
steps s
WHERE
t.id = s.testid
您可以在此处阅读有关OVER子句的更多信息:
请考虑养成
的习惯always specifying the schema for your tables,例如
test -> dbo.test
using the proper JOIN syntax,即代替
FROM
a, b
WHERE
a.col = b.col
DO
FROM a
INNER JOIN b
ON a.col = b.col
因此,考虑到所有这些要点,我们可以像这样重写上述查询:
SELECT
t.id,
t.name,
s.step_no,
s.step_data,
[count] = COUNT(*) OVER (PARTITION BY s.testid)
FROM
dbo.test AS t
INNER JOIN
dbo.steps AS s
ON
t.id = s.testid
;
答案 1 :(得分:1)
select t.id,t.name,s.step_no,s.step_data,counts.count
from test t
join steps s ON t.id = s.testid
join (select testid, count(*) as count
from steps
group by testid) counts ON t.id = counts.testid
答案 2 :(得分:0)
这是否有效......
DECLARE @test TABLE
(
id int identity primary key,
name varchar(20)
);
INSERT INTO @test VALUES('TC1'), ('TC2');
DECLARE @steps TABLE
(
id int identity primary key,
testid int,
step_no int,
step_data varchar(100)
);
INSERT INTO @steps(testid,step_no,step_data) VALUES
(1,1,'Step 1'), (1,2,'Step 2'),(1,3,'Step 3'),(2,1,'Step 1');
select t.id,t.name,s.step_no,s.step_data,(select SUM(testid) from @steps where testid = s.testid)
from @test t,@steps s
where t.id = s.testid