我需要使用创建自定义连接条件Sequelize.js http://sequelizejs.com使用 MSSQL。具体来说,我需要加入TableB
基于一个COALESCE
中的列的值TableA
and TableB
并最终得到这样的连接条件:
LEFT OUTER JOIN [TableB]
ON [TableB].[ColumnB] = COALESCE (
[TableC].[ColumnC],
[TableA].[ColumnA]
)
我愿意接受OR
我的加入中的条款:
LEFT OUTER JOIN [TableB]
ON [TableB].[ColumnB] = [TableA].[ColumnA]
OR [TableB].[ColumnB] = [TableC].[ColumnC]
I read https://stackoverflow.com/a/39774664/2345211你可以通过包括来实现这样的行为required: false
在你的范围定义中。正如你所看到的,我已经在我的瞄准镜上贴满了它,试图让它发挥作用。
我能得到的最好的就是这个(注意AND
条款):
LEFT OUTER JOIN [TableB]
ON [TableB].[ColumnB] = [TableA].[ColumnA]
AND [TableB].[ColumnB] = COALESCE (
[TableC].[ColumnC],
[TableA].[ColumnA]
)
如果我使用 MySQL,我想我可以简单地使用COALESCE
值来自SELECT
in the JOIN
很高兴去,但在我之前的研究中读到需要重新计算价值。
我已经包含了一个精简的模型定义TableA
:
export default (sequelize, DataTypes) => sequelize.define('TableA',
{
// Attributes omitted..
},
{
classMethods: {
associate ({
TableB,
TableC
}) {
this.belongsTo(TableB, {
foreignKey: 'ColumnA',
targetKey: 'ColumnB'
});
this.belongsTo(TableC, {
foreignKey: 'ColumnA',
targetKey: 'ColumnC'
});
},
attachScope ({
TableB,
TableC
}) {
this.addScope('defaultScope', {
attributes: [
...Object.keys(this.attributes),
[
sequelize.fn(
'COALESCE',
sequelize.col('[TableC].[ColumnC]'),
sequelize.col('[TableA].[ColumnA]')
),
'ColumnA'
]
],
include: [
{
model: TableB,
where: {
ColumnB: sequelize.fn(
'COALESCE',
sequelize.col('[TableC].[ColumnC]'),
sequelize.col('[TableA].[ColumnA]')
)
},
required: false
},
{
model: TableC,
required: false
}
],
required: false
}, { override: true });
}
}
}
);
任何帮助将不胜感激,如果需要任何其他信息,请告诉我。
注意:我正在使用旧数据库,遗憾的是无法更改数据结构。