对第二个查询中不匹配的数据运行第二个查询

时间:2019-02-19 23:15:38

标签: sql database-design

有两个表格,其中包含有关“图书”的详细信息。我们称它们为BooksData1BooksData2

我还有另一个具有bookIds和语言的表,我们称其为BookIdsAndLang。我需要收集BookIdsAndLang表中所有bookId和语言的图书数据。首先检查BooksData1表,如果找到bookIds和语言匹配,则从表中读取。对于BookData1中找不到的bookId和语言,请从BooksData2阅读。如果存在BooksData1BooksData2中都不存在的bookId和语言,则记录这些错误消息。

在当前实现中,BooksData1已经在bookIds和语言上与BookIdsAndLang内部联接。现在只需要在BookIdsAndLang中找不到的BooksData1中的bookId和语言,就需要在BooksData2中查找。

如何确定在BooksData1中不匹配的bookId和语言,以便可以与BooksData2内部结合。寻找可扩展的解决方案,因为将来可能会有BooksData3和BooksData4。

解决方案1:有一个临时表,说MissingBooksData。将在'BooksData1'中找不到的booksIds和语言插入其中。然后做

BooksData2 inner join MissingBooksData on Ids and languages

我们需要避免where..in子句,因为它有65536个值的限制,这种用例很容易超过该值。

请提出如何更好地进行设计的建议。谢谢

1 个答案:

答案 0 :(得分:0)

您可以使用OUTER JOINBookIdsAndLang中选择BookDataN中没有的行

SELECT l.bookId, l.langId
FROM BookIdsAndLang l
     LEFT OUTER JOIN BookData1 b1 
        ON b1.bookId = l.bookId AND b1.langId = l.langId
     LEFT OUTER JOIN BookData2 b2 
        ON b2.bookId = l.bookId AND b2.langId = l.langId
     ...
WHERE b1.bookId IS NULL AND
      b2.bookId IS NULL AND ...