问题描述
我有两个表需要连接在一起,但是两个表都需要先过滤。现在,我在sql Server中打开了两个表,并且都在特定列上选择了两个表,以便仅给出特定结果。基本上,如果这是Excel,我将过滤两个电子表格,然后过滤VLOOKUP
。
恐怕我的左联接将使我得到表2的所有行(50,000行)的结果,而我实际上必须使用15,000行。
我只需要加入表格,就可以看到有多少1:1比赛回到表1。我们只是在寻找100%1:1比赛。
解决方法
如果您知道首先要获取表1中的所有记录,则可以将过滤条件添加到表2的JOIN的ON语句中,或添加到派生表2的JOIN上。
INNER JOIN过滤器示例:
SELECT
*
FROM Table1 AS t1
INNER JOIN Table2 AS t2
ON t1.SupplierId = t2.SupplierId
AND t2.Column1 = ...condition
AND t2.Column2 = ...condition
WHERE
...Table1 filters
在派生表上的INNER JOIN:
SELECT
*
FROM Table1 AS t1
INNER JOIN (
SELECT * FROM Table2 WHERE ...Table2 filters
) AS t2
ON t1.SupplierId = t2.SupplierId
WHERE
...Table1 filters
要返回Table1中的所有行,而不管Table2中是否存在匹配项,则可以执行LEFT JOIN。
LEFT JOIN过滤器示例:
SELECT
*
FROM Table1 AS t1
LEFT JOIN Table2 AS t2
ON t1.SupplierId = t2.SupplierId
AND t2.Column1 = ...condition
AND t2.Column2 = ...condition
WHERE
...Table1 filters
在派生表上左联接:
SELECT
*
FROM Table1 AS t1
LEFT JOIN (
SELECT * FROM Table2 WHERE ...Table2 filters
) AS t2
ON t1.SupplierId = t2.SupplierId
WHERE
...Table1 filters
更新:
我只希望表1中的一列实质上显示匹配项或NULL。
/*
Show all rows in [2020_supplier1] where SetID = 'ID'
and a count of matching records from [2020supplier2]
*/
SELECT DISTINCT
t1.[Supplier Name],n.Table2Count -- will be NULL without a match.
FROM [2020_supplier1] AS t1
OUTER APPLY (
SELECT COUNT ( * ) AS Table2Count FROM [2020supplier2] AS t2
WHERE
t2.[Vendor Name] = t1.[Supplier Name]
AND t2.[Engagement Status] = 'your condition'
-- any additional filters...
) AS n
WHERE
t1.[SetID] = 'ID';
如果您不关心[2020supplier2]计数,可以使用以下方法进一步简化此操作并节省处理时间:
SELECT DISTINCT
t1.[Supplier Name],n.VendorMatch
FROM [2020_supplier1] AS t1
OUTER APPLY (
SELECT CASE
WHEN EXISTS (
SELECT * FROM [2020supplier2] AS t2 WHERE
t2.[Vendor Name] = t1.[Supplier Name]
AND t2.[Engagement Status] = 'your condition'
-- any additional filters...
) THEN 1
ELSE 0
END AS VendorMatch
) AS n
WHERE
t1.[SetID] = 'ID';
,
如果您不关心第二张表中的数据,则可以使用以下方法:
with cte as
( -- return unique [Vendor Name] only
select distinct [Vendor Name]
from [2020supplier2]
where [Engagement Status] = 'whatever'
)
Select t1.*
-- if there's no matching row the Outer Join returns NULL,case when t2.[Vendor Name] is null then 0 else 1 end as suppplier_exists
FROM [2020_supplier1] as t1
LEFT JOIN cte as t2
ON t1.[Supplier Name] = t2.[Vendor Name]
WHERE t1.[SetID] = 'ID'