簡體   English   中英

如何從表中選擇所有SQL行(具有兩列的唯一組合),其中相同的組合不在另一個表中

[英]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

我有一點困難,我正在准確地說出我的問題,但我會盡我所能。 我在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”。

如果我理解正確,您希望加入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

CopyISBN上加入SoldCopy ,但排除Books與兩個字段上的兩個表匹配的記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM