Sql server 续集查询,多对多关系问题
我目前有两个MSSQL表。“项目”表(包含项目“名称”)和“托盘”表(包含托盘“条形码”)。我有一个称为“ItemPallets”的连接表,它将多个项目链接到多个托盘 “项目托盘”包含项目Id(主键)和托盘Id(主键)以及“序列号” 数据的一个例子可以是: 项目Sql server 续集查询,多对多关系问题,sql-server,node.js,many-to-many,sequelize.js,Sql Server,Node.js,Many To Many,Sequelize.js,我目前有两个MSSQL表。“项目”表(包含项目“名称”)和“托盘”表(包含托盘“条形码”)。我有一个称为“ItemPallets”的连接表,它将多个项目链接到多个托盘 “项目托盘”包含项目Id(主键)和托盘Id(主键)以及“序列号” 数据的一个例子可以是: 项目 + -- + ---- + | Id | Name | + -- + ---- + | 1 | 123 | + -- + ---- + + -- + ------- + | Id | Barcode | + -- + ------
+ -- + ---- +
| Id | Name |
+ -- + ---- +
| 1 | 123 |
+ -- + ---- +
+ -- + ------- +
| Id | Barcode |
+ -- + ------- +
| 1 | ABC |
| 2 | DEF |
+ -- + ------- +
+ -- + ------ + -------- + ------------- +
| Id | ItemId | PalletId | Serial Number |
+ -- + ------ + -------- + ------------- +
| 1 | 1 | 1 | a400 |
| 2 | 1 | 1 | a401 |
| 3 | 1 | 1 | a402 |
| 4 | 1 | 2 | a403 |
+ -- + ------ + -------- + ------------- +
托盘
+ -- + ---- +
| Id | Name |
+ -- + ---- +
| 1 | 123 |
+ -- + ---- +
+ -- + ------- +
| Id | Barcode |
+ -- + ------- +
| 1 | ABC |
| 2 | DEF |
+ -- + ------- +
+ -- + ------ + -------- + ------------- +
| Id | ItemId | PalletId | Serial Number |
+ -- + ------ + -------- + ------------- +
| 1 | 1 | 1 | a400 |
| 2 | 1 | 1 | a401 |
| 3 | 1 | 1 | a402 |
| 4 | 1 | 2 | a403 |
+ -- + ------ + -------- + ------------- +
项目托盘
+ -- + ---- +
| Id | Name |
+ -- + ---- +
| 1 | 123 |
+ -- + ---- +
+ -- + ------- +
| Id | Barcode |
+ -- + ------- +
| 1 | ABC |
| 2 | DEF |
+ -- + ------- +
+ -- + ------ + -------- + ------------- +
| Id | ItemId | PalletId | Serial Number |
+ -- + ------ + -------- + ------------- +
| 1 | 1 | 1 | a400 |
| 2 | 1 | 1 | a401 |
| 3 | 1 | 1 | a402 |
| 4 | 1 | 2 | a403 |
+ -- + ------ + -------- + ------------- +
这意味着托盘ABC中有三个项目的名称为123,分别序列号为a400、a401和a402,托盘DEF中有一个项目的名称为123,序列号为a403
我正在尝试取回与项目托盘关联的所有ItemPallet行,即Item.Pallet[0]。ItemPallet应包含一个数组,我希望该数组包含三行,序列号为a400、a401和a402
然而,虽然我的阵列包含两个托盘,为什么每个托盘只包含一个序列号
我目前使用的代码如下:
models.Item.findOne({
where: {id: 1},
include: [
{ model: models.Pallet }
]
});
代码生成的查询返回三行-您可以通过将
raw:true
添加到where
和include
旁边的选项中看到这一点。我设法得出结论,Sequelize只考虑最后返回的行-如果您将查询的顺序
更改为相反,您将获得序列号为a403的ItemPallets
至于现在,我建议你换一种方式
models.ItemPallets.findAll({
where: {
ItemId: 1
}
}).then((itemPallets) => {
// here you get all ItemPallets of Item with id 1
});
我将尝试找出为什么Sequelize在这种情况下会这样做,如果我知道任何有用的信息,请告诉您
编辑
根据您的评论,也可以通过查询项
表来实现这一点
models.Item.findByPrimary(1, {
include: [ models.ItemPallets ]
}).then((itemWithItemPallets) => {
// here you get (example output) { id: 1, ItemPallets: [{ id: 1, ItemId: 1, PalletId: 1, serialNumber: a400 }, { ... }]
});
上面的查询没有
`JOIN ItemsPallets ON ItemsPallets.ItemId=Item.id,其中Item.id=1`
因此它返回
Item
的Item
的所有itempalllets
,id=1对不起,我的错误。查询实际上返回两行,每个托盘一行。这很好,但是,我希望看到每个托盘内的每个序列号。我需要查询该项目并获取该项目的所有序列号。这需要在item表上执行,因为我有其他联接和item表特有的其他where子句。是的,我的错误也是返回两行,因为在ItemPallets
中有两个项目,但是它仍然在每个Pallet
对象上只返回单个ItemPallet
。我已经更新了答案,向您展示了如何通过查询Item
model来实现