Sql 根据与此行相关的列是否存在于其他表中筛选行值
我有一个表a,有以下列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
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