我有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
Table1和Table2中的记录以外的其他不同列中的所有记录,则应在输出中仅选择那些记录。
编辑:
仅显示F列中的001,因为它具有所有4行,并且在相同的列中具有相同的值,如表2所示。在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中的行计数。
一些在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)
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句