提取不包含值的记录

问题描述 投票:0回答:2

假设我有一些包含客户详细信息 C 的表和一些包含订单详细信息 O 的表 我还有存储特殊订单的即时变量表@S

DECLARE @S TABLE (Category varchar(250), Item nvarchar(500));
INSERT INTO @S VALUES ('Hardware', 'Hammer'), ('Fruits', 'Apple')

如何将这些表连接在一起以仅提取不包含特殊订单表中声明的项目的记录? 即,这意味着一些仅包含“Hammer”的记录如果不包含“Apple”,也应该被提取,反之亦然。

下面的示例表:

Orders Table 
Order ID CustID     Item_ID Category Item   Qty Total
000505   000001     100101  Fruits   Apple   1  $50.00
000505   000001     100102  Veg      Tomatoes2  $100.00
000505   000001     100103  Veg      Cabbage 1  $50.00
000506   000002     100101  Fruits   Apple   2  $100.00
000506   000002     100106  Hardware Hammer  1  $50.00

Clients Table
CustID  Name    Forename    
000001  Smith   John            
000002  Jones   David
000003  Doe     Joe

我只对 CustID 感兴趣,其中订单不包含声明为特殊 @S 的商品,因此 David 将超出范围,因为他的订单包含声明为特殊的商品。 John Record 应该出现,因为他的订单 000505 只包含一件特殊商品,即 Apple,但错过了 Hammer。Joe 也是如此,因为他没有下任何订单 NULL,所以他也应该在范围内

预期结果


CustID  Name    Forname  Item
000001  Smith   John     Apple    
000003  Doe     Joe      NULL

非常感谢您的帮助

sql database
2个回答
0
投票

嘿,如果我理解正确的话,我认为解决这个问题的方法是为每个订单类型创建一些数组,然后检查数组的交集是否等于“特殊订单”数组。 我正在使用 Snowflake Dialect,因此您的 SQL 方言可能意味着数组函数具有不同的名称。 第一个 CTE 为每个订单 ID 创建一个项目数组。 然后生成特殊项目数组并交叉连接,以便每个订单都附加特殊数组。 然后,第二个 CTE 查看数组的交集。 然后,第三个也是最后一个检查数组的交集是否等于原始特殊数组,即特殊数组完全包含在数组和所有元素出现的顺序内。 我不清楚您在此之后想要什么,但更改

=
!=
之间的最后一个 where 子句将过滤掉有特殊订单的人

with array_gen AS (
SELECT 
order_id 
, customer_id 
, ARRAY_AGG(DISTINCT o.Item) as order_content 
, ARRAY_AGG(DISTINCT s.Item) as special_order_content
FROM orders as o
CROSS JOIN special as s
GROUP BY 1 ,2
    )
, intersect_check AS (
    SELECT 
order_id
, customer_id
, order_content
, special_order_content
, ARRAY_INTERSECTION(special_order_content,order_coNtent ) AS ARRAY_INTERSECT
  FROM array_gen
)

SELECT *
FROM intersect_check
WHERE ARRAY_INTERSECT  = special_order_content

0
投票

LEADER 00000ngma 2200529Ka 4500 001 61232477 005 20050809 磁带 OCLC0809: 0317 007 caaadmnarauuac 先生 ----- 008 050810s1970 xxu016 mceng d 009 :f 添加日期:050810 添加 ID:OCL 修改日期:080602 修改日期:XRF 035 (PFA-FILM)12814 035 GLADN151908659 040 CUY|beng|cCUY 090 |b1606-27-1943 245 00 [广告。 Computer Image Corporation]|h[电影] /|cComputer Image Corporation。 257 美国。 260 美国:|bComputer Image Corporation,|c1970。 300 1 卷 1(16 分钟)(584 英尺):|bopt sd., col. ;|c16 毫米。 |3打印。 505 0 美国储蓄贷款协会,旧金山 -- 底特律国家银行 -- 金融联合会 -- 周六晚间电影稍后继续 -- 摩托罗拉电信节目中心 -- 7 点电影 -- 克莱斯勒-普利茅斯二手车 -- Safeguard 除臭皂 -- Happy 洗面奶 -- 山毛榉坚果薄荷口香糖 -- 电脑动画 -- Interlake, Inc. -- Pontiac 1971 Granville。 506 太平洋电影资料馆收藏;非循环。|5CUY。 520 包含 11 个真人短片和电脑动画广告、电脑动画片段和广告片。 590 PFA 1606-27-1943。 |a 条件说明:最后一次检查:2005 年 8 月 9 日褪色。 650 0 银行和银行业务。 650 0 汽车。 650 0 肥皂。 650 0 口香糖。 655 7 广告。|2mim 655 7 电视。|2mim 655 7 动画。|2mim 655 7 广告。|2mim 655 7 预告片和宣传片。|2mim 710 2 Computer Image Corporation。 740 02 广告。美国储蓄贷款公司,旧金山。 740 02 广告。底特律国家银行。 740 02 广告。金融联盟公司 740 02 商业广告。摩托罗拉电信节目中心。 740 02 7点新闻——电视宣传片。 740 02 广告。克莱斯勒-普利茅斯二手车。 740 02 广告。保护除臭肥皂。 740 02 广告。快乐洗面奶。 740 02 广告。山毛榉坚果薄荷口香糖。 740 02 广告。 Interlake, Inc. 740 02 庞蒂亚克 1971 格兰维尔。 740 42 周六晚上的电影——电视宣传片。 935 GLADN151908659 956 20140224|bPFA 迁移/合并加载 957 OCLC 外部参照加载 20140309 994 02|bCUY

© www.soinside.com 2019 - 2024. All rights reserved.