假设我正在建立图书借阅数据库。
Product product = repository.getProduct(id)
ProductBuilder.Builder builder = new ProductBuilder.Builder()
if(product == null){
builder.location("abc").quantity(5).price(10)
if(parmas.getAvaiability() != null){
builder.availability(parmas.getAvaiability())
}
} else {
builder.withProduct(product)
.availability(params.getAvailability())
}
我希望我的查询列出具有当前贷方名称的所有图书,但是如果没有人借出该图书,它仍应使用名称字段NULL列出该图书。
此查询两次列出ID为(2)的书。但是我希望它仅显示当前贷方的名称一次。
我尝试使用内部联接,右联接,但无法实现。我想念什么?
我以前在lend_history中有“ is_current”列,但在阅读Could I make a column in a table only allows one 'true' value and all other rows should be 'false'之后,我决定创建一个单独的表以进行更好的实践。
答案 0 :(得分:3)
由于对“ is_current”列的处理,因此三个表之间不能具有直接联接。一种方法是使用Derived Tables(子查询);在子查询中,您可以获取所有“当前”的借出历史记录项。现在,简单地handleInputChange(e: React.ChangeEvent<HTMLInputElement>) {
this.setState({
[e.target.name]: e.target.value
});
}
子查询结果到books表:
Argument of type '{ [x: string]: string; }' is not assignable to parameter of type 'IState | ((prevState: Readonly<IState>, props: Readonly<{}>) => IState | Pick<IState, "email" | "password" | "errors"> | null) | Pick<IState, "email" | "password" | "errors"> | null'.
Type '{ [x: string]: string; }' is missing the following properties from type 'Pick<IState, "email" | "password" | "errors">': email, password, errorsts(2345)
结果
LEFT JOIN
边注::我宁愿坚持使用原来的架构,即拥有两个表SELECT b.id, dt.lender_name
FROM books AS b
LEFT JOIN
(
SELECT lh.book_id, lh.lender_name
FROM lend_current AS lc
JOIN lend_history AS lh ON lh.id = lc.lend_history_id
) AS dt ON dt.book_id = b.id
和{{1,而不是创建第三个表| id | lender_name |
| --- | ----------- |
| 1 | |
| 2 | ola |
}}。现在要确定哪个历史记录行是当前的,我们可以有两种方法:
lend_current
字段(如果当前行,则为1。books
表中有一个lend_history
字段,用于存储当前历史记录行的is_current
。如果当前未借出该书,则为current_history_id
。这也可以利用外键约束。