Sql 根据与此行相关的列是否存在于其他表中筛选行值

Sql 根据与此行相关的列是否存在于其他表中筛选行值,sql,Sql,我有一个表a,有以下列 Name| Product_Id| ----|-----------| 1 | 100 | 1 | 300 | 1 | 500 | 2 | 600 | 2 | 700 | 2 | 800 | 2 | 900 | 还有另一个表B,它可能包含也可能不包含上面提到的所有产品ID | Product_Id| |-----------| | 100

我有一个表a,有以下列

Name| Product_Id| 
----|-----------|
1   | 100       | 
1   | 300       | 
1   | 500       | 
2   | 600       | 
2   | 700       | 
2   | 800       | 
2   | 900       | 
还有另一个表B,它可能包含也可能不包含上面提到的所有产品ID

| Product_Id| 
|-----------|
| 100       | 
| 300       | 
| 500       | 
现在我想要的结果应该是表B中没有任何产品的“名称”, 预期结果:

|2
注意:如果“2”甚至有一个“Product_Id”也存在于表B中,则它不符合结果中的条件


使用
不在

 select distinct name from TableA 
where Product_Id not in (select Product_Id from tableB)

SELECT tA.Name
FROM tableA tA
LEFT JOIN tableB tB ON tB.Product_Id = tA.Product_Id
WHERE t2.name IS NULL

您也可以使用
不存在

SELECT DISTINCT a.Name
FROM table_a a
WHERE NOT EXISTS (
    SELECT 1
    FROM table_b b
    WHERE b.Product_Id = a.Product_Id
)

您可以使用
cte

with t as (
     select t.Name, t.Product_Id, t1.Product_Id as Avail_Product_Id
     from table t left join
          table2 t1
          on t1.Product_Id = t.Product_Id
)

select distinct t.Name
from t
where not exists (select 1 from t t1 where t.Name = t1.Name and t1.Avail_Product_Id is not null);
你可以试试这个

DECLARE @TableA TABLE(Name INT, Product_Id INT)
INSERT INTO @TableA VALUES
(1 ,100 ), 
(1 ,300 ),
(1 ,500 ),
(1 ,800 ),
(2 ,600 ),
(2 ,700 ),
(2 ,800 ),
(2 ,900 )


DECLARE @TableB TABLE(Product_Id INT)
INSERT INTO @TableB VALUES
(100), 
(300), 
(500)

SELECT DISTINCT Name FROM @TableA A 
WHERE Name NOT IN (
    SELECT Name FROM @TableA A 
    WHERE A.Product_Id IN (SELECT Product_Id FROM @TableB) 
)
结果:

Name
-----------
2
标记您正在使用的DBMS(即
MySQL
SQL Server,
等)。
Name
-----------
2