获取满足所有条件的记录

时间:2019-07-24 21:22:04

标签: sql sql-server

我有2张桌子

表1

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

表2

A | B | C | D | E
a   1   2   1  4
b   4   3   1  4
c   1   1   1  4
d   1   2   1  4

输出:

F    |  D  
001    1

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

编辑:

仅显示F列中的001,因为它具有与表2相同的所有4行,并且它们在同一列中的值相同。未选择F列中值002的记录,因为它们没有表中的所有行2。 我尝试过的东西-

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中的行计数。

1 个答案:

答案 0 :(得分:0)

一些在SQL Fiddle中运行的示例创建代码:

create table t1 (
    A varchar(1),
    B int,
    C int,
    D int,
    E int, 
    F int);
create table t2 (
    A varchar(1),
    B int,
    C int,
    D int,
    E int);
insert into t1 VALUES 
    ('a', 1, 2, 1, 4, 1),
    ('b', 4, 3, 1, 4, 1),
    ('c', 1, 1, 1, 4, 1),
    ('b', 1, 3, 1, 4, 1),
    ('d', 1, 2, 1, 4, 1),
    ('a', 1, 2, 1, 4, 2),
    ('b', 4, 3, 1, 4, 2),
    ('b', 1, 1, 1, 4, 2);
insert into t2 VALUES 
    ('a',1,2,1,4), ('b',4,3,1,4), ('c',1,1,1,4), ('d',1,2,1,4);

将两个表结合在一起,仅选择列A和F,并使用一个不同的子句删除重复项:

SELECT DISTINCT t1.A, t1.F
FROM t1 
    LEFT JOIN t2 ON t2.A = t1.A
WHERE t1.B = t2.B
    AND t1.C = t2.C
    AND t1.D = t2.D
    AND t1.E = t2.E;

计算每个F的总行数:

SELECT count(DISTINCT t1.A) AS countNum, t1.F
FROM t1 
    LEFT JOIN t2 ON t2.A = t1.A
WHERE t1.B = t2.B
    AND t1.C = t2.C
    AND t1.D = t2.D
    AND t1.E = t2.E
GROUP BY t1.F

仅使用Haveing子句过滤出所有与a,b,c,d都匹配的内容:

SELECT t1.F
FROM t1 
    LEFT JOIN t2 ON t2.A = t1.A
WHERE 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(DISTINCT t1.A) = 4

如果您事先不知道有多少个不同的约束,则可以将t4中的约束数量计数替换为'4':

SELECT t1.F
FROM t1 
    LEFT JOIN t2 ON t2.A = t1.A
WHERE 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(DISTINCT t1.A) = 
    (SELECT COUNT(DISTINCT A) FROM t2)

(我相信也可以将其放入CTE。)

那里的最后一个块仅选择F列,但我不知道您是否可以明确选择其他任何列,因为如果t1中有行('d',1,1,1,4,001)怎么办?应该显示什么?

根据您的需要,您可以将最后一个块放入子查询中,以用于类似WHERE F IN (above query)的情况。