【问题标题】:Selecting Items from another table using ID使用 ID 从另一个表中选择项目
【发布时间】:2020-09-15 17:51:58
【问题描述】:

我有两个表 Item 和一个记录每个订单中的项目的表(Junction Table)

项目表

String itemTable = "CREATE TABLE " + ITEM_TABLE + " ("
        + ID_ITEM + " INTEGER PRIMARY KEY AUTOINCREMENT,"
        + ITEM_NAME + " TEXT,"
        + ITEM_TYPE + " TEXT,"
        + ITEM_PRICE + " TEXT);";

ORDER_ITEM 表

String orderItemTable = "CREATE TABLE " + ORDER_ITEM_TABLE + " ("
        + ID_ORDER_ITEM + " INTEGER,"
        + ID_ITEM_ORDER + " INTEGER,"
        + " FOREIGN KEY ("+ID_ORDER_ITEM+") REFERENCES "+ EMP_TABLE +"("+ ID_EMP +"), "
        + " FOREIGN KEY ("+ID_ITEM_ORDER+") REFERENCES "+ EMP_TABLE +"("+ ID_EMP +"));";

ORDER_ITEM 表中的数据每个 Item id 指的是项目表中的特定项目,这是我试图引用并用于从 DB 中提取数据的项目。

目前我可以从该表中提取 Item id,但不能使用 ID 提取实际的 Item。这里idOrder是在选择订单时传递的

String selctAllEmployeesOrdersItems = "SELECT * FROM " + ORDER_ITEM_TABLE + " WHERE " + ID_ORDER_ITEM + " = " + idOrder;

实现我想要的一种方法是将Item ID's 存储在ArrayList 中并对其进行迭代以选择所有Items,但我知道有更好的方法。

我看到的一些研究建议我加入引用 ITEM ID 的表,但我不确定语法是否正确。点表示法不适用于此查询。

String selctAllEmployeesOrdersItems = "SELECT * FROM " + ORDER_ITEM_TABLE + " WHERE " + ID_ORDER_ITEM + " = " + idOrder
        + " JOIN " + ITEM_TABLE + " ON " + ORDER_ITEM_TABLE+"."+ID_ITEM_ORDER + " = " + ITEM_TABLE+"."+ID_ITEM;

显示的错误信息是

原因:android.database.sqlite.SQLiteException:在“JOIN”附近: 语法错误(代码 1 SQLITE_ERROR):,编译时:SELECT * FROM ORDER_ITEM_TABLE WHERE ID_Order = 1 加入 ITEM_TABLE ON ORDER_ITEM_TABLE.ID_Item = ITEM_TABLE.ID

【问题讨论】:

    标签: java android sqlite android-sqlite


    【解决方案1】:

    您的 SQL 语句的语法错误。
    WHERE 子句必须写在join之后:

    String selctAllEmployeesOrdersItems = 
      "SELECT * FROM " + ORDER_ITEM_TABLE + " AS o " + 
      "INNER JOIN " + ITEM_TABLE + " AS i ON o." + ID_ITEM_ORDER + " = i." + ID_ITEM + " " +
      "WHERE o." + ID_ORDER_ITEM + " = " + idOrder;
    

    注意两个表使用别名 oi 可以显着缩短代码。

    还有,表ORDER_ITEM的定义:

    String orderItemTable = "CREATE TABLE " + ORDER_ITEM_TABLE + " ("
            + ID_ORDER_ITEM + " INTEGER,"
            + ID_ITEM_ORDER + " INTEGER,"
            + " FOREIGN KEY ("+ID_ORDER_ITEM+") REFERENCES "+ EMP_TABLE +"("+ ID_EMP +"), "
            + " FOREIGN KEY ("+ID_ITEM_ORDER+") REFERENCES "+ EMP_TABLE +"("+ ID_EMP +"));";
    

    似乎不正确。
    EMP_TABLE是什么表?
    为什么ID_ORDER_ITEMID_ITEM_ORDER 两列都引用同一列?
    这没有意义。

    【讨论】:

      【解决方案2】:

      我相信您的子句顺序错误,应该是: 选择...从...加入...在...哪里... 所以在这种情况下:

      SELECT * FROM
      ORDER_ITEM_TABLE JOIN ITEM_TABLE
      ON ORDER_ITEM_TABLE.ID_Item = ITEM_TABLE.ID
      WHERE ORDER_ITEM_TABLE.ID_Order=1;
      

      【讨论】:

        【解决方案3】:

        where 子句位于连接之后。我还建议使用表别名来缩短查询并使其更具可读性。最后,您可能只想从项目表中选择列,而不是从联结表(您已经在过滤)中选择列:

        SELECT i.*
        FROM ORDER_ITEM_TABLE oi 
        JOIN ITEM_TABLE i ON oi.ID_Item = i.ID
        WHERE oi.ID_Order = 1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-03
          • 2012-08-07
          • 1970-01-01
          • 1970-01-01
          • 2012-03-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多