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

时间:2016-04-24 22:50:26

标签: c# mysql database select

我正在准确地说出我的问题是什么,但我会尽我所能。我在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”。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您希望加入Sold上的CopyISBN,除非Sold {在Copy ISBN上匹配的{1}}。 我可能会离开,但也许这会有所帮助。

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 上的SoldCopy,但排除ISBN匹配两个字段上的两个表的记录。