如何在需要过滤的两个表上保持联接?

问题描述

我有两个表需要连接在一起,但是两个表都需要先过滤。现在,我在sql Server中打开了两个表,并且都在特定列上选择了两个表,以便仅给出特定结果。基本上,如果这是Excel,我将过滤两个电子表格,然后过滤VLOOKUP

恐怕我的左联接将使我得到表2的所有行(50,000行)的结果,而我实际上必须使用15,000行。

  • 表1-供应商名称(3,000条记录)
  • 表2-供应商名称(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'

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...