Not in 子句不使用开放查询过滤 SQL Server

Posted

技术标签:

【中文标题】Not in 子句不使用开放查询过滤 SQL Server【英文标题】:Not in clause not filtering SQL Server with open query 【发布时间】:2017-04-11 13:36:56 【问题描述】:

所以我有两个看起来像这样的表


库存表(这只是拉一个空位置列表)

|loc|

|ECA001|
_____

库存转移作业列表表

|id | oid | sku | from_loc | to_loc | tag | qty | processed |  create_date | processed date

|2  | 003 | 123 | SD034 |  |T100010| 2 | NULL | 2017-04-06 | NULL

___

我想做的是填充 Inventory_Transfer_Job_List_Table。 To_loc 与我的第一个表上的下一个空位置和我的 Inventory_Transfer_Job_List.to_loc 表中尚未使用的位置

我现在只是在使用 select 语句,以确保在更新之前我插入了正确的数据。

我试过了

select * from
    (select loc from openquery(wms7,'SELECT lc_f.loc FROM lc_f left join iv_f on 
    lc_f.loc = iv_f.loc WHERE lc_f.loc like ''EC%'' AND lc_f.loc not in   (select 
    loc from iv_f where loc like ''EC%'' OR loc = ''ECRETURNS'')')) as a , 
[db1].[dbo].[ECOM_Transfer_Inventory_Job_List]  as b
where to_loc = ''
and a.loc  not in (SELECT to_loc
               FROM   [db1].[dbo].[ECOM_Transfer_Inventory_Job_List] 
               WHERE  to_loc != '')

但我只得到一个重复的值

ex.
loc | id | oid | sku | from_loc | to_loc | tag | qty | processed |  create_date | processed date

|ECA001| 1 | 0001 |0003 | MCA022 | | T100001| 2 | Null | 2017-04-06 | NULL

|ECA001| 7 | 0023 |0015 | MCA049 | | T100051| 12 | Null | 2017-04-06 | NULL

而不是仅仅过滤掉已经使用过的那些。

帮助将非常感谢您,

【问题讨论】:

你正在做一个CROSS JOIN。所以你会得到cartesian product。 SQL-Server 或 Informix,不是一回事... 我在 sql-server 上构建它,但 openquery 是 informix 谢谢你,bjones,我不知道。 【参考方案1】:

这是您的查询正在执行的示例。

SELECT *
FROM (SELECT 1 a
        UNION ALL
      SELECT 2) a,
(SELECT 3 b
    UNION ALL
 SELECT 4) b 

尝试添加WHERE Something in table a = something in table b

ON a.Column = b.Column

如果您有 SQL-Server 2008 +,也许以下内容将满足您的需求。

SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY loc) AS RowNum, loc 
 FROM OPENQUERY(wms7,'SELECT lc_f.loc FROM lc_f LEFT JOIN iv_f ON 
lc_f.loc = iv_f.loc WHERE lc_f.loc LIKE ''EC%'' AND lc_f.loc NOT IN (SELECT 
loc FROM iv_f WHERE loc LIKE ''EC%'' OR loc = ''ECRETURNS'')')) AS a
JOIN (SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, *
    FROM [db1].[dbo].[ECOM_Transfer_Inventory_Job_List])  AS b ON  a.RowNum = b.RowNum
WHERE b.to_loc = ''
  AND a.loc  NOT IN (SELECT to_loc
                     FROM   [db1].[dbo].[ECOM_Transfer_Inventory_Job_List] 
                     WHERE  to_loc != '')

【讨论】:

谢谢,但是如果他们没有任何共同的列可以匹配,我应该如何加入他们? @CharlesCooper ,您可能需要根据业务需求做出决定,但也许上面的编辑会有所帮助。 你就是那个男人!谢谢你教我笛卡尔积。 @CharlesCooper,很高兴我能帮上忙。

以上是关于Not in 子句不使用开放查询过滤 SQL Server的主要内容,如果未能解决你的问题,请参考以下文章

在SQL Server中为什么不建议使用Not In子查询

SQL学习05——高级数据过滤

SQL 基础之where过滤和比较运算符

关于Oracle SQL中NOT IN子句的工作机制

SQL:如何在带有“NOT IN”条件的“Where”子句中使用“and”和“or”

Sql server not in 子句不起作用