sql - WHERE NOT EXISTS 条款仅部分起作用
问题描述
下午好,
我目前正在运行一个带有 WHERE NOT EXISTS 的查询,它可以解决我的大多数问题,但某些行正在被跳过。我一直在努力解决这个问题大约三个小时,但没有运气。这是我的表结构。
ContractItems(特定客户的特定合同中的项目。)
| Manufacturer | Style | Color | Size | Sort |
|--------------|-------|-------|------|------|
| LIB | 586M | FL | | 0 |
| LIB | 586M | FL | 2XL | 6 |
| LIB | 586M | FL | 3XL | 7 |
| SSA | 08700 | CHHEA | | 0 |
| SSA | 08700 | CHHEA | 2XL | 6 |
| SSA | 08700 | CHHEA | 3XL | 7 |
MPRODUCT(主产品列表)
| Manufacturer | Style | Color | Size | Sort |
|--------------|-------|-------|------|------|
| LIB | 586M | FL | XS | 1 |
| LIB | 586M | FL | S | 2 |
| LIB | 586M | FL | M | 3 |
| LIB | 586M | FL | L | 4 |
| LIB | 586M | FL | XL | 5 |
| LIB | 586M | FL | 2XL | 6 |
| LIB | 586M | FL | 3XL | 7 |
| LIB | 586M | FL | 4XL | 8 |
| LIB | 586M | FL | 6XL | 10 |
| SSA | 08700 | CHHEA | S | 2 |
| SSA | 08700 | CHHEA | M | 3 |
| SSA | 08700 | CHHEA | L | 4 |
| SSA | 08700 | CHHEA | XL | 5 |
| SSA | 08700 | CHHEA | 2XL | 6 |
| SSA | 08700 | CHHEA | 3XL | 7 |
因此,我使用 WHERE NOT EXISTS 子句从 MPRODUCT 表中选择 ContractItems 表中不存在的尺寸。这是我正在运行的查询:
SELECT * FROM
(SELECT
ci.MANUFACTURER [Vendor],
ci.Style [Style],
ci.Color [Color],
ci.Item_Size [Size],
mp.sort [Sort]
from dbo.contractitems ci
join MPRODUCT mp on mp.BARCODE = ci.barcode
WHERE ci.Item_Size <> ''
and con_num = 1068
and con_store = 98
and item_type = 0
and ((mp.MANUFACTURER = 'LIB' and mp.STYLE = '586M')
or (mp.MANUFACTURER = 'SSA' and mp.STYLE = '08700'))
UNION ALL
SELECT
mp.MANUFACTURER [Vendor],
mp.Style [Style],
mp.Color [Color],
mp.Item_Size [Size],
mp.sort [Sort]
FROM MPRODUCT MP
join ContractItems as ci on
CI.MANUFACTURER = MP.MANUFACTURER
and CI.STYLE = MP.STYLE
and CI.COLOR = MP.COLOR
WHERE NOT EXISTS
(SELECT 1
from dbo.contractitems ci
WHERE ci.MANUFACTURER = mp.MANUFACTURER
and ci.Style = mp.STYLE
and ci.Color = mp.COLOR
and ci.item_size = mp.item_size)
and con_num = 1068
and con_store = 98
and item_type = 0
and ((mp.MANUFACTURER = 'LIB' and mp.STYLE = '586M')
or (mp.MANUFACTURER = 'SSA' and mp.STYLE = '08700'))
and ci.ITEM_SIZE = '')a
ORDER BY Vendor, Style, Color, Sort
这适用于 SSA-08700,但不适用于 LIB-586M。这是我的结果集。
结果:
| Manufacturer | Style | Color | Size | Sort |
|--------------|-------|-------|------|------|
| LIB | 586M | FL | XS | 1 |
| LIB | 586M | FL | 2XL | 6 |
| LIB | 586M | FL | 3XL | 7 |
| SSA | 08700 | CHHEA | S | 2 |
| SSA | 08700 | CHHEA | M | 3 |
| SSA | 08700 | CHHEA | L | 4 |
| SSA | 08700 | CHHEA | XL | 5 |
| SSA | 08700 | CHHEA | 2XL | 6 |
| SSA | 08700 | CHHEA | 3XL | 7 |
预期结果:将模仿 MPRODUCT 表,但从 ContractItems 表中提取未见过的价格。
| Manufacturer | Style | Color | Size | Sort |
|--------------|-------|-------|------|------|
| LIB | 586M | FL | XS | 1 |
| LIB | 586M | FL | S | 2 |
| LIB | 586M | FL | M | 3 |
| LIB | 586M | FL | L | 4 |
| LIB | 586M | FL | XL | 5 |
| LIB | 586M | FL | 2XL | 6 |
| LIB | 586M | FL | 3XL | 7 |
| LIB | 586M | FL | 4XL | 8 |
| LIB | 586M | FL | 6XL | 10 |
| SSA | 08700 | CHHEA | S | 2 |
| SSA | 08700 | CHHEA | M | 3 |
| SSA | 08700 | CHHEA | L | 4 |
| SSA | 08700 | CHHEA | XL | 5 |
| SSA | 08700 | CHHEA | 2XL | 6 |
| SSA | 08700 | CHHEA | 3XL | 7 |
有没有人知道为什么它只会为 LIB-586M 选择 XS 记录而为其他人拉所有尺寸?
联盟之前的结果:
| Manufacturer | Style | Color | Size | Sort |
|--------------|-------|-------|------|------|
| LIB | 586M | FL | 2XL | 6 |
| LIB | 586M | FL | 3XL | 7 |
| SSA | 08700 | CHHEA | 2XL | 6 |
| SSA | 08700 | CHHEA | 3XL | 7 |
联盟后的结果:
| Manufacturer | Style | Color | Size | Sort |
|--------------|-------|-------|------|------|
| LIB | 586M | FL | XS | 1 |
| SSA | 08700 | CHHEA | S | 2 |
| SSA | 08700 | CHHEA | M | 3 |
| SSA | 08700 | CHHEA | L | 4 |
| SSA | 08700 | CHHEA | XL | 5 |
解决方案
解决了。我不知道为什么这会奏效,但我在 WHERE NOT EXISTS 子句中添加了更多子句,它似乎可以解决问题。
这是工作代码:
SELECT * FROM
(SELECT
dbo.trim(ci.MANUFACTURER) [Vendor],
dbo.trim(ci.Style) [Style],
dbo.trim(ci.Color) [Color],
dbo.trim(ci.Item_Size) [Size],
ci.sort [Sort]
from dbo.contractitems ci
WHERE ci.Item_Size <> ''
and ci.status = 0
and con_num = 1068
and con_store = 98
UNION ALL
SELECT
MP.MANUFACTURER [Vendor],
MP.Style [Style],
MP.Color [Color],
MP.Item_Size [Size],
Mp.SORT [Sort]
FROM MPRODUCT MP
join CITEM as ci on CI.MANUFACTURER = MP.MANUFACTURER and CI.STYLE = MP.STYLE and CI.COLOR = MP.COLOR
WHERE NOT EXISTS
( select 1 from ContractItems ci
where
con_num = 1068
and CON_STORE = 98
and ci.status = 0
and CI.MANUFACTURER = MP.MANUFACTURER
AND CI.STYLE = MP.STYLE
AND CI.ITEM_SIZE = MP.ITEM_SIZE
AND CI.COLOR = MP.COLOR)
and con_num = 1068
and con_store = 98
and item_type = 0
and ci.item_size = ''
and ci.STATUS = 0)a
ORDER BY Vendor, Style, Color, Sort
推荐阅读
- cmake - CMake:如何仅包含一个头目录
- php - PHP - 单击提交时在文本框中显示随机数据
- scheme - 如何在球拍列表中进行分配
- string - 覆盖 Sub 中的 List(of String) 元素
- python - 替换文件中的单词
- gstreamer - 函数均衡器 = gst_element_factory_make ("equalizer-3bands", NULL); 返回 NULL
- reactjs - 使用 JSX.Element 是一种好习惯吗?
- php - 我的 WampServer 在托盘图标中没有 apache 设置
- mongodb - 如何检查日期和时间差mongodb聚合并推入数组
- typescript - Typescript 通用函数,以便类型推断和代码提示起作用