我正在准确地说出我的问题是什么,但我会尽我所能。我在Visual Studio中使用C#,连接到SQL数据库。
我有一个二手书店数据库,卖家可以进来给我们出售给他们的书。有三个关键表:
我们可以假设原始卖家绝不会两次出售同一本书。
当顾客来买书时,店员会通过两个下拉列表查找每本书。第一个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”。
答案 0 :(得分:0)
如果我理解正确,您希望加入Sold
上的Copy
和ISBN
,除非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
上的Sold
和Copy
,但排除ISBN
匹配两个字段上的两个表的记录。