Получить все записи, используя соединение - PullRequest
0 голосов
/ 03 июня 2019

У меня есть две таблицы, подобные следующей:

Table1

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

Table2

 Id Table1_Col Table2_Col
 1    A           Test

Я хочу количество (Table1_Col) в Table2 , и мне нужен запрос для следующего вывода:

Ожидаемый результат

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 ]

3 голосов
/ 03 июня 2019

Вам нужно GROUP BY, при использовании агрегатных методов.Также 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

Демо на дб <> fiddle


ОБНОВЛЕНИЕ: Согласно комментарию в посте , основанном на вашей скрипке, условие t3.visitno=1 должно быть в LEFT OUTER JOIN, а не в предложении WHERE, поэтому будет работать следующий запрос:

select t3.pvisitno, t1.DocName, count(t2.vdocid) as [count]
from Document_type t1
left outer join visitdocs t2 on t2.DocId = t1.DocId
left outer join visittbl t3 on t3.visitno = t2.visitno and t3.visitno=1
group by t3.pvisitno,t1.DocName
order by count(t2.vdocid) desc

db <> демонстрация скрипки для пересмотренной скрипки

1 голос
/ 03 июня 2019

Попробуйте этот запрос:

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
0 голосов
/ 03 июня 2019

Вот еще один вариант:

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;

Идея состоит в том, чтобы создать встроенное представление таблицы 2 с его счетами, а затем объединить его с исходной таблицей.

"coalesce" необходим, потому что встроенное представление будет иметь записи только для строк в table2, поэтому любые пробелы в запросе будут "нулевыми", в то время как вы указали, что хотите "0".

0 голосов
/ 03 июня 2019

Вы можете попробовать это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...