AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / computer / 问题 / 1713924
Accepted
skelso
skelso
Asked: 2022-04-01 12:54:47 +0800 CST2022-04-01 12:54:47 +0800 CST 2022-04-01 12:54:47 +0800 CST

如何比较从子/联结表中提取的值集?

  • 772

我对数据库工作比较陌生,所以我可能会错误地使用一些术语。请不要被那个误导。

假设我有三个表:Items、Customers 和一个连接两者的 Junction 表。(这与我的实际用例无关,所以忽略任何看起来不合理的东西。我只是在调味应该是一个抽象的例子。)

假设 Items 表有 4 条记录,数字 1 到 4。假设 Customers 表有 10 条记录,字母 A 到 J。假设这是 Junction 表:

物品 顾客
1 一个
1 C
1 H
2 一个
2 H
3 一个
3 C
3 H
4 C
4 D
4 乙

这张表上的排序很容易看出它在某种意义上将项目映射到客户集,如下所示:

物品 客户集
1 {A,C,H}
2 {A,H}
3 {A,C,H}
4 {C、D、E}

我正在寻找比较这些集合映射的方法。让 X 和 Y 是任意两个项目,让 J(X) 是由联结表将 X 映射到的客户集合。我希望能够回答以下问题:

  1. J(X) = J(Y) 吗?[扩展,所以不考虑顺序]
  2. J(X) 是 J(Y) 的子集吗?
  3. J(X) 是否与 J(Y) 部分重叠?如果是这样,它们的交叉点是什么?

从计算的角度来看,这些似乎都是非常基本的问题。我拒绝相信没有办法做到这一点。如果在 Access 中不可能,但在其他系统中可能,你能指出我正确的方向吗?

microsoft-access
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    FlexYourData
    2022-04-02T14:10:14+08:002022-04-02T14:10:14+08:00

    假设您的表是t. 请记住,我们可以考虑以下定义:

    • item_1 是正在比较的项目
    • customer_1 是被比较项目的客户
    • item_2 是与 item_1 比较的项目
    • customer_2 是与 item_1 比较的商品的客户

    然后你可以这样做:

    SELECT x.item AS item_1, x.customer AS customer_1, y.item AS item_2, y.customer AS customer_2
    FROM t AS x
         INNER JOIN t AS y ON x.item <> y.item AND x.customer = Y.customer
    UNION ALL
    SELECT DISTINCT x.item, x.customer, y.item, null
    FROM t AS x
         LEFT JOIN t AS y ON x.item <> y.item
    AND NOT EXISTS (SELECT 1 FROM t AS z WHERE z.item = y.item AND z.customer = x.customer)
    UNION ALL 
    SELECT DISTINCT y.item, NULL, x.item, x.customer
    FROM t AS x
         RIGHT JOIN t AS y ON x.item <> y.item
    AND NOT EXISTS (SELECT 1 FROM t AS z WHERE z.item = y.item AND z.customer = x.customer)
    ORDER BY item_1, item_2, customer_1;
    

    此查询包含三个部分。

    第 1 部分 - 获取商品不同且客户相同的行

    SELECT x.item AS item_1, x.customer AS customer_1, y.item AS item_2, y.customer AS customer_2
    FROM t AS x
         INNER JOIN t AS y ON x.item <> y.item AND x.customer = Y.customer
    

    第 2 部分 - 获取项目不同且 item_1 的客户在 item_2 的客户列表中不存在的行

    SELECT DISTINCT x.item, x.customer, y.item, null
    FROM t AS x
         LEFT JOIN t AS y ON x.item <> y.item
    AND NOT EXISTS (SELECT 1 FROM t AS z WHERE z.item = y.item AND z.customer = x.customer)
    

    第 3 部分 - 获取项目不同且 item_2 的客户在来自 item_1 的客户列表中不存在的行

    SELECT DISTINCT y.item, NULL, x.item, x.customer
    FROM t AS x
         RIGHT JOIN t AS y ON x.item <> y.item
    AND NOT EXISTS (SELECT 1 FROM t AS z WHERE z.item = y.item AND z.customer = x.customer)
    

    考虑 item_1 = 1 的情况。目标是将项目 2 - 4 的每个客户集与项目 1 的客户集进行比较。结果如下(我已将其粘贴到 Excel 中,以便对其进行注释)

    在此处输入图像描述

    现在假设您使用该查询并将其保存为数据库中名为 [comparisons] 的视图,那么您可以执行以下操作(除其他外):

    SELECT item_1,
           item_2,
           CASE WHEN COUNT(DISTINCT customer_1) = COUNT(DISTINCT customer_2) 
                THEN 'set is the same size' ELSE 'set is not the same size' 
                END AS set_size_comparison,
           CASE WHEN SUM(CASE WHEN customer_1 IS NULL THEN 1 ELSE 0 END) <> 0 
                THEN 'item_2 has customers not present in item_1' ELSE 'item_1 entirely contains item_2' 
                END AS check_1,
           CASE WHEN SUM(CASE WHEN customer_2 IS NULL THEN 1 ELSE 0 END) <> 0 
                THEN 'item_1 has customers not present in item_2' ELSE 'item_2 entirely contains item_1' 
                END AS check_2
    FROM comparisons
    WHERE item_1 = 1
    GROUP BY item_1, item_2;
    
    item_1 item_2 设置大小比较 检查_1 检查_2
    1 2 设置大小不一样 item_1 完全包含 item_2 item_1 的客户不在 item_2 中
    1 3 设置大小相同 item_1 完全包含 item_2 item_2 完全包含 item_1
    1 4 设置大小相同 item_2 的客户不在 item_1 中 item_1 的客户不在 item_2 中
    • 0

相关问题

  • MS Access 数据库实例放在共享服务器上时损坏

  • MS Access 条件格式只比较数字的第一位

  • 在 Access 中输入多值字段是否有更简单的方法?

  • Microsoft Access 2019,一对一关系(SuperType -> SubType)

  • 将电子表格导入 Access 时,如何防止 Excel 自动分配数据字段类型?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何减少“vmmem”进程的消耗?

    • 11 个回答
  • Marko Smith

    从 Microsoft Stream 下载视频

    • 4 个回答
  • Marko Smith

    Google Chrome DevTools 无法解析 SourceMap:chrome-extension

    • 6 个回答
  • Marko Smith

    Windows 照片查看器因为内存不足而无法运行?

    • 5 个回答
  • Marko Smith

    支持结束后如何激活 WindowsXP?

    • 6 个回答
  • Marko Smith

    远程桌面间歇性冻结

    • 7 个回答
  • Marko Smith

    子网掩码 /32 是什么意思?

    • 6 个回答
  • Marko Smith

    鼠标指针在 Windows 中按下的箭头键上移动?

    • 1 个回答
  • Marko Smith

    VirtualBox 无法以 VERR_NEM_VM_CREATE_FAILED 启动

    • 8 个回答
  • Marko Smith

    应用程序不会出现在 MacBook 的摄像头和麦克风隐私设置中

    • 5 个回答
  • Martin Hope
    Saaru Lindestøkke 为什么使用 Python 的 tar 库时 tar.xz 文件比 macOS tar 小 15 倍? 2021-03-14 09:37:48 +0800 CST
  • Martin Hope
    CiaranWelsh 如何减少“vmmem”进程的消耗? 2020-06-10 02:06:58 +0800 CST
  • Martin Hope
    Jim Windows 10 搜索未加载,显示空白窗口 2020-02-06 03:28:26 +0800 CST
  • Martin Hope
    v15 为什么通过电缆(同轴电缆)的千兆位/秒 Internet 连接不能像光纤一样提供对称速度? 2020-01-25 08:53:31 +0800 CST
  • Martin Hope
    andre_ss6 远程桌面间歇性冻结 2019-09-11 12:56:40 +0800 CST
  • Martin Hope
    Riley Carney 为什么在 URL 后面加一个点会删除登录信息? 2019-08-06 10:59:24 +0800 CST
  • Martin Hope
    zdimension 鼠标指针在 Windows 中按下的箭头键上移动? 2019-08-04 06:39:57 +0800 CST
  • Martin Hope
    jonsca 我所有的 Firefox 附加组件突然被禁用了,我该如何重新启用它们? 2019-05-04 17:58:52 +0800 CST
  • Martin Hope
    MCK 是否可以使用文本创建二维码? 2019-04-02 06:32:14 +0800 CST
  • Martin Hope
    SoniEx2 更改 git init 默认分支名称 2019-04-01 06:16:56 +0800 CST

热门标签

windows-10 linux windows microsoft-excel networking ubuntu worksheet-function bash command-line hard-drive

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve