【问题标题】:Access SQL Select rows that have value in common with results of condition访问 SQL 选择与条件结果具有共同值的行
【发布时间】:2016-02-26 07:26:39
【问题描述】:

假设我有一个简单的表格,格式如下:

==================================
| ID | Invoice | Box | Delivered |
==================================
|  1 |   AA11  |  1  |   True    |
----------------------------------
|  2 |   AA11  |  2  |   False   |
----------------------------------    
|  3 |   AA22  |  1  |   False   |
----------------------------------
|  4 |   AA33  |  1  |   False   |
----------------------------------    
|  5 |   AA44  |  1  |   True    |
----------------------------------

ID 是一个唯一的整数,Invoice 是一个 TEXT 字段,Box 是一个整数,Delivered 是一个布尔值(或 BIT,正如 Access 中所知)。

这样的查询会获取已交付的所有内容的列表:

SELECT * FROM Deliveries WHERE Delivered = True

但是,每张发票可以有多个箱子(例如 1111 号发票就是这种情况),有时并非所有箱子都同时送达。如果一个盒子已经送达,我希望能够获得具有相同发票号码的其他盒子的状态。

我知道我可以运行多个查询来执行此操作。我上面提到的一个,然后另一个循环遍历所有返回结果,然后使用 Invoice = #### 运行另一个选择。

有没有办法在一个查询中完成所有这些操作?我认为它可能在 WHERE EXISTS,但我不知道如何构造查询。

理想情况下,我希望为上述单个查询返回的行能够是 ID 为:1、2 和 5 的行。这是我正在寻找的输出:

==================================
| ID | Invoice | Box | Delivered |
==================================
|  1 |   1111  |  1  |   True    |
----------------------------------
|  2 |   1111  |  2  |   False   |
----------------------------------    
|  5 |   4444  |  1  |   True    |
----------------------------------

因此,即使 ID 2 的 Delivered = False,它仍然会被退回,因为具有相同发票编号的另一个项目已 Delivered = True

尝试一些查询时出现错误

无法加入备忘录、ole 或超链接对象

【问题讨论】:

    标签: sql ms-access select where exists


    【解决方案1】:

    如果我弄乱了 Access 语法,我们深表歉意:

    select id
    from T
    group by id
    having sum(iif(Delivered, 1, 0) < count(*)
    

    调用上述查询IC(不完整)。您可能希望查看所有未传递的数据以及 id:

    select * from T
    where id in (<IC>) and Delivered = false
    

    【讨论】:

    • 这很好,但你能添加所有其他字段吗?现在你只输出 id 字段
    【解决方案2】:

    假设你想要这样的东西

    select * from invoice where invoice in (SELECT invoice FROM invoice WHERE Delivered = 'True')
    

    使用嵌套查询,您可以选择输出发票编号以供父查询参考。这里嵌套查询的输出用于'过滤'结果。

    您已经开始使用它,但这是另一种方法,无需更改表格。

    SELECT invoice.ID, invoice.Invoice, invoice.Box, invoice.Delivered, invoice_1.Delivered AS Expr1
    FROM invoice, invoice AS invoice_1
    WHERE (((invoice.Invoice)=[invoice_1].[Invoice]) AND (([invoice_1].[Delivered])=Yes));
    

    你可以测试一下here

    对于遇到相同问题的人,有一个解释和解决方案here

    【讨论】:

    • 我有类似的东西,但是当我运行它时收到一条错误消息:子查询“发票”中的无效备忘录、OLE 或超链接对象。我正在使用 Access JET 数据库
    • 在我的实际项目中,我表中的 Invoice 字段是一个文本字段而不是整数(必须是,有些发票中有字母)。似乎 Access 不喜欢这些在子查询中。有什么想法吗?
    • 在这种情况下你必须使用'like' not in
    • 您能否相应地更新您的数据集,但首先您能否使用我提供的链接尝试一下,看看我是否走在正确的轨道上
    • 您提供的链接给出了完美的答案,正是我正在寻找的。我将 IN 更改为 LIKE,我得到了同样的错误。我更新了原始问题中的数据集。我试图通过仅将其用作整数来简化问题,但我认为这并不重要(但显然确实如此)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-28
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    相关资源
    最近更新 更多