【问题标题】:How to select all the SQL rows from a table (With a unique combination of two columns) where the same combination is not already in another table如何从表中选择所有 SQL 行(具有两列的唯一组合),其中相同的组合不在另一个表中
【发布时间】:2016-08-18 04:58:57
【问题描述】:

我很难准确地说出我的问题是什么,但我会尽力而为。我在 Visual Studio 中使用 C#,连接到 SQL 数据库。

我有一个二手书店数据库,卖家可以进来,将他们的书交给我们为他们出售。共有三个关键表:

  • 图书(包含我们销售的 10 本书,每本书都有一个唯一的 ISBN 标识该图书)
  • 已售出(所有已售出的图书,由图书的 ISBN 和原卖家的 ID [称为 SSBID] 标识)
  • 复制(数据库中曾经存在的所有图书,包括已售出的图书。由相同的 ISBN 和卖家 ID [称为 SSID] 标识)

我们可以假设原始卖家永远不会两次出售同一本书。

当客户来买书时,店员会通过两个下拉列表查找每本书。第一个 DDL 填充了系统中具有图书的每个 ISBN,如下所示。 (如果 ISBN 不存在,则无需列出!)

SELECT DISTINCT [ISBN] FROM [Copy] ORDER BY [ISBN]

第二个下拉列表应该填充每个销售具有相同 ISBN 的图书的卖家的卖家 ID。但是,我们不想列出任何已售出的图书的卖家 ID。对我来说最有意义的 select 语句如下,但我不相信逻辑是完美的。

SELECT [SSID] FROM [Copy] WHERE (SSID, ISBN NOT IN (SELECT SSBID, ISBN FROM Sold)) AND ([ISBN] = @ISBN) ORDER BY [SSID]

因此,我们不想在 Copy 和 Sold 中提取具有相同唯一组合的 SSID 和 ISBN 的任何记录,同时只显示与我们已经选择的 ISBN 对应的记录。

第二个查询应该是什么样的? SSID 和 SSBID 名称不同会影响查询的功能吗?

为清楚起见,这里是复制和销售的粗略布局:

复制

- SSID_______ISBN
 - 115________019
 - 115________528
 - 123________528
 - 503________019

已售出

- SSBID_____ISBN
 - 115_______019

所以在我的第一个下拉菜单中选择“115”后,第二个下拉菜单应该只填充“528”。

【问题讨论】:

    标签: c# mysql database select


    【解决方案1】:

    如果我理解正确,您想在ISBN 上同时加入SoldCopy,除非SoldCopy 中的记录都匹配@987654326 @ SSID。 我可能很遥远,但也许这会有所帮助。

    SELECT b.ISBN, b.SSID
    FROM
        Books b
        JOIN Sold s on b.ISBN = s.ISBN 
        JOIN Copy c on b.ISBN = c.ISBN
        LEFT JOIN Sold s2 on b.ISBN = s2.ISBN and b.SSID = s2.SSID
        LEFT JOIN Copy c2 on b.ISBN = c2.ISBN and b.SSID = c2.SSID
    WHERE s2.ISBN is null or c2.ISBN is null
    

    这将在ISBN 上同时加入SoldCopy,但排除Books 在两个字段上匹配两个表的记录。

    【讨论】:

    • 感谢您的回复!我想我可能添加了一些不必要的信息。 Book 表不应该真正解决这里的问题。基本上,我想提取不在 Sold 表中的 Copy 表的所有记录,但我需要使用两个 ID(SSID 和 ISBN)的唯一匹配集来执行此操作。你是对的,带有 IS NULL 的 LEFT JOIN 是正确的方法,但是在匹配 2 列时我该如何做呢?像这样?从副本中选择 SSID A LEFT JOIN Sold B ON (A.SSID = B.SSBID AND A.ISBN = B.ISBN) WHERE (B.SSBID AND B.ISBN) IS NULL
    • 终于搞定了。我使用“ SELECT A.SSID FROM Copy A LEFT JOIN Sold B ON A.SSID = B.SSBID AND A.ISBN = B.ISBN WHERE (B.SSBID IS NULL OR B.ISBN IS NULL) AND (A.[ISBN ] = @ISBN)” 我一直收到“不明确的列名”错误,直到我添加了“A.[ISBN]”。现在效果很好!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-08
    • 1970-01-01
    • 2012-02-24
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多