有两个表格,其中包含有关“图书”的详细信息。我们称它们为BooksData1
和BooksData2
。
我还有另一个具有bookIds和语言的表,我们称其为BookIdsAndLang
。我需要收集BookIdsAndLang
表中所有bookId和语言的图书数据。首先检查BooksData1
表,如果找到bookIds和语言匹配,则从表中读取。对于BookData1
中找不到的bookId和语言,请从BooksData2
阅读。如果存在BooksData1
或BooksData2
中都不存在的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个值的限制,这种用例很容易超过该值。
请提出如何更好地进行设计的建议。谢谢
答案 0 :(得分:0)
您可以使用OUTER JOIN
在BookIdsAndLang
中选择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 ...