查询具有两个值列表的数据库表以获取不同的列值

时间:2017-01-06 15:00:07

标签: sql postgresql

我在Postgres中有以下表格

Employee: 
    EmployeeId, 
    EmployeeName,
    EmployeeSal, 
    PrimaryKey(EmployeeId)

EmployeeBonus: 
    BonusCode, 
    BonusAmount, 
    EmployeeId, 
    PrimaryKey(BonusCode, EmployeeId)

我们有大约50个BonusCodes,而EmployeeBonus表有1500万行

我在java程序中有以下数据。

  1. 员工ID列表(约20000)
  2. 红利代码列表(约80000)
  3. 以上数据位于如下地图中。我可以获得每个员工的BonusCode列表清单 (EmployeeId,List(BonusCodes))

    现在我在Java程序中的要求是从EmployeeBonus表中找到具有BonusCode和EmployeeId的唯一组合的记录 使用提供的2个列表。

    任何人都可以帮我找到最佳的方法来找到性能良好的结果。

    查询1:

    SELECT DISTINCT BonusCode, EmployeeId 
    FROM EmployeeBonus;
    

    获取现有结果(大约1500万),并在java程序中处理它们 但是这个查询在java程序中抛出OutOfMemoryError,因为数据的大小很大。

    QUERY2:

    SELECT DISTINCT BonusCode, EmployeeId 
    FROM EmployeeBonus 
    WHERE EmployeeId = :EmployeeId 
      AND BonusCode IN (:BonusCodeList);
    

    循环使用EmployeeId列表并使用BonusCode列表多次执行上述查询 工作正常,但需要花费大量时间来执行多个查询并收集结果

    QUERY3:

    SELECT DISTINCT BonusCode, EmployeeId 
    FROM EmployeeBonus 
    WHERE BonusCode = :BonusCode 
      AND EmployeeId IN (:EmployeeIdList);
    

    循环使用BonusCode列表并使用EmployeeId列表多次执行上述查询 工作正常,但需要花费大量时间来执行多个查询并收集结果

    Query4:

    SELECT DISTINCT BonusCode, EmployeeId 
    FROM EmployeeBonus 
    WHERE EmployeeId IN (:EmployeeIdList) 
      AND BonusCode IN (:BonusCodeList);
    

    然而,这不是我想要的数据列表

0 个答案:

没有答案