在另一个表中查找具有匹配记录的记录

时间:2019-08-02 13:23:22

标签: sql-server tsql

我有2张桌子

表1

A | B  | C | D | E | F
a   Mi   2   1  4   001
b   Ma   3   1  4   001
c   NA   1   1  4   001
b   Na   3   1  4   001
d   Na   2   1  4   001
a   Mi   2    1  4   002
b   Na   3    1  4   002
c   Ma   1    1  4   002
d   Na   2   1  4   001

表2

A | B | C | D | E
a   Mi   2   1  4
b   Ma   3   1  4
c   NA   1   1  4
d   Na   2   1  4

输出:

F    |  D  
001    1

因此,A,B,C,D,E和F列都是满足特定条件的列。表1是具有需要与表2中的数据进行比较的数据的表。如果F以外的不同列中的所有记录都从表1与表2中的记录匹配,则应在输出中仅选择那些记录。

仅显示F列中的001,因为它具有与表2相同的所有4行,并且它们在同一列中具有相同的值。未选择F列中值002的记录,因为它们没有在F中的所有行。表2。它们确实具有所有4行,但是带有b的记录没有所有相同的匹配值。

最终结果不必是我提到的输出。可能是所有与表2中给出的行相匹配的行。输出就是最后一步。如果我获得与表2中的所有记录匹配的所有行(例如按like),就可以实现这一点。

我尝试过的事情-

select count(A) over(Partition by A,B,C,D,E,F) as rw,* 
into #temp1 
from Table1

select sum(rw) as sm, F 
from #temp1 group by F

select F 
from #temp
where sm = (select count(A) from Table2)

此逻辑的问题之一是002可以有2-3个重复的行,这可能导致计数等于table2中的行计数。

2 个答案:

答案 0 :(得分:1)

先连接表,然后再连接group by F

select t1.f, max(t1.d) d
from table2 t2 inner join (select distinct * from table1) t1
on t1.A = t2.A and t1.B = t2.B and t1.C = t2.C and t1.D = t2.D and t1.E = t2.E
group by t1.f
having count(*) = (select count(*) from table2)

我使用了max(t1.d),因为不清楚每个F的D值是否相同。
请参见demo
结果:

> f   |  d
> :-- | -:
> 001 |  1

如果您希望table1中的行与table2中的行匹配,请使用CTE:

with cte as (
  select t1.f
  from table2 t2 inner join (select distinct * from table1) t1
  on t1.A = t2.A and t1.B = t2.B and t1.C = t2.C and t1.D = t2.D and t1.E = t2.E
  group by t1.f
  having count(*) = (select count(*) from table2)
)
select t1.* from table1 t1
where 
  t1.f in (select f from cte)
  and exists (
    select 1 from table2 t2
    where t1.A = t2.A and t1.B = t2.B and t1.C = t2.C and t1.D = t2.D and t1.E = t2.E
  )

请参见demo
结果:

> A  | B  |  C |  D |  E | F  
> :- | :- | -: | -: | -: | :--
> a  | Mi |  2 |  1 |  4 | 001
> b  | Ma |  3 |  1 |  4 | 001
> c  | NA |  1 |  1 |  4 | 001
> d  | Na |  2 |  1 |  4 | 001
> d  | Na |  2 |  1 |  4 | 001

如果要使用不同的行,请使用:

select distinct t1.* from table1 t1

相反。
结果:

> A  | B  |  C |  D |  E | F  
> :- | :- | -: | -: | -: | :--
> a  | Mi |  2 |  1 |  4 | 001
> b  | Ma |  3 |  1 |  4 | 001
> c  | NA |  1 |  1 |  4 | 001
> d  | Na |  2 |  1 |  4 | 001

答案 1 :(得分:0)

不管我在评论中提到的可疑行,我认为这是您想要的:

import { Injectable } from '@angular/core';
import { Task } from '../Task';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';
import { Headers , RequestOptions } from '@angular/http';

@Injectable({
  providedIn: 'root'
})
export class TaskService {

  Headers:Headers = new Headers();
  Options:any;

  serveur : string='http://127.0.0.1:8000/';

  constructor(public http:HttpClient) {
    this.Headers.append('enctype','multipart/form-data');
    this.Headers.append('Content-Type','application/json');
    this.Headers.append('X-Requested-with','XMLHttpRequest');
    this.Options = new RequestOptions({Headers:this.Headers});
   }

  addTask(title):Observable<Task>{
    const newTask=new Task(title);
    //console.log(newTask);
    return this.http.post<Task>(this.serveur+'add',newTask);
  }  
}