c# - 如何从表中选择所有 SQL 行(具有两列的唯一组合),其中相同的组合不在另一个表中

标签 c# mysql database select

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

我有一个旧书店数据库,卖家可以进来把他们的书给我们,让我们为他们销售。关键表有3个:

  • 图书(包含我们出售的 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 名称不同会影响查询功能吗?

为清楚起见,这里是 Copy 和 Sold 的粗略布局:

复制

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

已售出

- SSBID_____ISBN
 - 115_______019

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

最佳答案

如果我理解正确,你想在 ISBN 上加入 SoldCopy,除非 Sold< 中都有记录 Copy 匹配ISBN 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 匹配两者的记录两个领域的表格。

关于c# - 如何从表中选择所有 SQL 行(具有两列的唯一组合),其中相同的组合不在另一个表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36829790/

相关文章:

php - 尝试使用一个查询对两个不同的数据库表进行两次插入

ruby-on-rails - Rails 中的双多态关联

c - MonetDB客户端编译

c# - 如何解决C#异常 "The expression must be evaluated for a node set"

php - 当设置保存 php 和 ajax 时,密码字段更新为空

mysql - Azure MySql Rest API。插入新的防火墙规则

database - Worklight Server 是否支持存储 JSON 文件?

c# - 当鼠标悬停在内部 ListView 上时,ListView 内的 WPF ListView 不滚动

c# - 为我的电子调查应用程序创建一个 .csv 文件。我该如何开始?

c# - Azure 移动应用程序 : The request could not be completed.(错误请求)