canal icon indicating copy to clipboard operation
canal copied to clipboard

Relation condition column must in select columns

Open lengmianshi opened this issue 5 years ago • 2 comments

为什么关联查询中on的字段一定要被select呢?实际上on的查询条件未必用得上啊

com.alibaba.otter.canal.client.adapter.es.config.SchemaItem.TableItem#getRelationTableFields image

lengmianshi avatar Feb 03 '20 14:02 lengmianshi

public Map<FieldItem, List<FieldItem>> getRelationTableFields() { if (relationTableFields == null) { synchronized (SchemaItem.class) { if (relationTableFields == null) { relationTableFields = new LinkedHashMap<>();

                    getRelationFields().forEach(relationFieldsPair -> {
                        FieldItem leftFieldItem = relationFieldsPair.getLeftFieldItem();
                        FieldItem rightFieldItem = relationFieldsPair.getRightFieldItem();
                        FieldItem currentTableRelField = null;
                        if (getAlias().equals(leftFieldItem.getOwner())) {
                            currentTableRelField = leftFieldItem;
                        } else if (getAlias().equals(rightFieldItem.getOwner())) {
                            currentTableRelField = rightFieldItem;
                        }

                        if (currentTableRelField != null) {
                            List<FieldItem> selectFieldItem = getSchemaItem().getColumnFields()
                                .get(leftFieldItem.getOwner() + "." + leftFieldItem.getColumn().getColumnName());
                            if (selectFieldItem != null && !selectFieldItem.isEmpty()) {
                                relationTableFields.put(currentTableRelField, selectFieldItem);
                            } else {
                                selectFieldItem = getSchemaItem().getColumnFields()
                                    .get(rightFieldItem.getOwner() + "."
                                         + rightFieldItem.getColumn().getColumnName());
                                if (selectFieldItem != null && !selectFieldItem.isEmpty()) {
                                    relationTableFields.put(currentTableRelField, selectFieldItem);
                                } else {
                                    throw new UnsupportedOperationException(
                                        "Relation condition column must in select columns.");
                                }
                            }
                        }
                    });
                }
            }
        }
        return relationTableFields;
    }

lengmianshi avatar Feb 03 '20 14:02 lengmianshi

@agapple 帮忙看下?

ofloxacin avatar Apr 10 '24 08:04 ofloxacin