sql server—从一个表中选择不在另一个表子集中的记录

wbgh16ku  于 2021-08-01  发布在  Java
关注(0)|答案(3)|浏览(400)

我正在尝试准备一个查询,以便将每日报表中的新条目插入到SQLServer数据库中的一个单独表中。
我有两张table如下:
表1

id   style_code   location_code
-------------------------------
 1   abcd         IST
 2   abcd         DEL
 3   wxyz         DEL

表2

id    style_code   location_code
--------------------------------
 1    abcd         IST
 2    wxyz         IST
 3    abcd         DEL
 4    wxyz         DEL

我想选择表2中“style\u code”和“location\u id”组合在表1中不存在的所有行。在这个特定的示例中,这意味着从表2中返回的第2行“wxyx&ist”在表1中不存在(id列之间没有关系。表2是临时表)
我一直试图将连接放入带有not in的select查询中,但似乎无法使查询正常工作。

SELECT *
FROM [Table 2]
WHERE style_code NOT IN (SELECT style_code
                         FROM [Table 1] 
                         INNER JOIN [Table 2] ON [Table 2].location_code = [Table 1].location_code);

我有一个sql编码初学者的理解,但不是Maven,并将感谢任何指导。

qcuzuvrc

qcuzuvrc1#

你可以用 NOT EXISTS 以及相关子查询。

SELECT *
       FROM [Table 2] t2
       WHERE NOT EXISTS (SELECT *
                                FROM [Table 1] t1
                                WHERE t1.style_code = t2.style_code
                                      AND t1.location_code = t2.location_code);
ckocjqey

ckocjqey2#

你可以用 NOT EXISTS :

SELECT *
FROM [Table 2]
WHERE NOT EXISTS (SELECT1
                  FROM [Table 1] 
                  WHERE [Table 2].location_code = [Table 1].location_code AND
                        [Table 2].style_code = [Table 1].style_code
                 );

有些数据库(越来越多)确实支持具有 IN 以及 NOT IN . 但是,sql server不在其中。
此外,我强烈建议使用 NOT EXISTS 而不是 NOT IN 使用子查询时。 NOT IN 如果子查询返回的任何值是 NULL . 那样的话, NOT IN 过滤掉所有行,结果集为空。

vxbzzdmp

vxbzzdmp3#

另一种方法-您可以使用 LEFT OUTER JOIN . 这个sql可能会比其他sql提供更好的性能 NOT EXISTS 或者 NOT IN 条款。

select t2.id, t2.style_code, t2.location_code 
from table_2 t2 left outer join table_1 t1 
on t2.style_code = t1.style_code
and t2.location_code = t1.location_code
where t1.style_code is null;

相关问题