【问题标题】:Flutter: Select from two table with distinc in Moor DatabaseFlutter:从 Moor 数据库中具有不同的两个表中进行选择
【发布时间】:2026-02-22 15:30:01
【问题描述】:

我有这样的查询 SQL:

SELECT DISTINCT LST_KURS.LKU_ID, LST_KURS.LKU_SYMBOL FROM LST_PRODUCT_CALC join LST_KURS WHERE LST_PRODUCT_CALC.LKU_ID = LST_KURS.LKU_ID AND LST_PRODUCT_CALC.PSET_ID = #{psetId}

如何在 moor 上编写该查询?

这是我的 LST_KURS 表:

import 'package:moor/moor.dart';

class LstKurs extends Table {
  @override
  String get tableName => 'LST_KURS';

  TextColumn get lkuId => text().named('LKU_ID')();

  IntColumn get lsneId => integer().named('LSNE_ID').nullable()();

  TextColumn get lkuSymbol => text().named('LKU_SYMBOL').nullable()();

  @override
  Set<Column> get primaryKey => {lkuId};
}

这是我的 lst_prodset_calc 表:

import 'package:moor_flutter/moor_flutter.dart';

class LstProdsetCalc extends Table {
  @override
  String get tableName => 'lst_prodset_calc';

  IntColumn get psetId => integer()
      .named('PSET_ID')
      .customConstraint('NULL REFERENCES lst_prodset (PSET_ID)')();

  TextColumn get lkuId => text().named('LKU_ID')();

  @override
  Set<Column> get primaryKey => {psetId, lkuId};
}

这是我在 Dao 中的功能:

Future<List<String>> getListKurs(int psetId) {
    // idk how to write that query on moor in here
  }

【问题讨论】:

    标签: flutter flutter-moor


    【解决方案1】:

    首先创建你的模型。

    class KursSymbol {
      final String lkuId;
      final String lkuSymbol;
      KursSymbol({
        this.lkuId,
        this.lkuSymbol,
      });
    }
    

    并修改了你的 dao 函数。

    Future<List<KursSymbol>> getKursSymbol(int psetId) {
        return customSelect(
            'SELECT DISTINCT LST_KURS.LKU_ID, LST_KURS.LKU_SYMBOL FROM lst_prodset_calc join LST_KURS WHERE lst_prodset_calc.LKU_ID = LST_KURS.LKU_ID AND lst_prodset_calc.PSET_ID = :psetId',
            variables: [Variable.withInt(psetId)],
            readsFrom: {lstKurs, lstProdsetCalc}).map((QueryRow row) {
          return KursSymbol(
            lkuId: row.readString('LKU_ID'),
            lkuSymbol: row.readString('LKU_SYMBOL'),
          );
        }).get();
      }
    

    【讨论】: