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的主要内容,如果未能解决你的问题,请参考以下文章