使用join获取所有记录

时间:2019-06-03 12:53:00

标签: sql sql-server

我有两个如下表:

表1

Id Table1_Col 
1   A
2   B
3   C
4   D
5   E

表2

 Id Table1_Col Table2_Col
 1    A           Test

我想要 Table2 中的(Table1_Col)计数,并且需要查询以下输出:

预期产量

Table1_Col     Count_Table2_Col
    A                 1
    B                 0
    C                 0
    D                 0
    E                 0

到目前为止,我已经尝试过:

select Table1_Col,Count(Table2_Col) from table1 t1
Left outer join table2 t2 on t1.Table1_Col = t2.Table1_Col

请为此提供适当的解决方案。

4 个答案:

答案 0 :(得分:3)

使用聚合方法时,您需要DebugJs。两个表中还存在import {DebugJs} from '.../path'; const debug = new DebugJs(); // typing and intellisense will work ,因此请为列使用适当的表别名。

以下查询将返回您的预期结果。请也找到演示。

GROUP BY

Demo on db<>fiddle


更新:根据the comment in the post,根据您的小提琴,条件Table1_Col应该在select T1.Table1_Col, Count(T2.Table2_Col) AS Table2_Col from table1 t1 Left outer join table2 t2 on t1.Table1_Col = t2.Table1_Col GROUP BY T1.Table1_Col 而不是t3.visitno=1中子句,因此以下查询将起作用:

LEFT OUTER JOIN

db<>fiddle demo for the revised fiddle

答案 1 :(得分:1)

尝试此查询:

select t1.Table1_Col,
       sum(case when Table2_Col is null then 0 else 1 end) Count_Table2_Col
from Table1_Col t1
left join Table2 t2 on t1.Table1_Col = t2.Table1_Col
group by t1.Table1_Col

答案 2 :(得分:0)

您可以尝试以下方法:

Declare @t table ( id int ,col varchar(50))

insert into @t values (1,'A')
insert into @t values (2,'B')
insert into @t values (3,'C')

Declare @t1 table ( id int ,col varchar(50),col2 varchar(50))

insert into @t1 values (1,'A','TEST')

select t.col,count(t1.id) countT2 from @t t left join @t1 t1
on t.id=t1.id
group by t.col

答案 3 :(得分:0)

这是另一种选择:

select t1.Table1_Col, coalesce(x.cnt, 0) cnt
  from table1 t1 
  left outer join (select Table2_Col, count(*) cnt from table2 group by Table2_Col) x 
    on x.Table2_Col = t1.Table1_Col;

这里的想法是创建一个table2的内联视图及其计数,然后将其与原始表连接起来。

“ coalesce”是必需的,因为内联视图将仅包含table2中行的记录,因此在您指定要为“ 0”的同时,查询中的任何间隙都将为“ null”。