首页 > 解决方案 > Android 如何定义多对多 SQLite 查询

问题描述

我有两个表,第一个包含类别、菜单项和我在商店出售的数量。所以例如

Table A
CATEGORY X MENU          X QUANTITY
Chicken  x ChickenStew   x 7 
Beef     x Stew          x 10
Fish     x FishStew      x 8 
Chicken  X Chicken Stew  x 5
Fish     X Fish Stew     x 2

我有第二个表,它定义了每个菜单项的物料清单,如下所示

table B
MENU          X  BILL_OF_MATERIAL
Chicken Stew  x  chicken
Chicken Stew  x  sauce
Chicken Stew  x  salt

我想要一个 SQLite 查询,它将第一个表 A 中的每个类别、菜单和数量复制到第三个表 C 中,并匹配表 B 中的相应物料清单。因此,如果我在表 A 中有一个菜单项和数量,其中有 11表 B 中的物料清单中的项目。当我运行查询时,它将复制到表 C 中的 11 个项目,这将是菜单项、其数量和带有 BOM 的 11 行

Table C
    Category x MenuItem X Quantity x Bill of Material

这就是我所拥有的,但它似乎不起作用

UPDATE OE_Sales_Activity SET RawMatType = (SELECT RawMaterialPortion FROM Define_Raw_Material_Portioning where Define_Raw_Material_Portioning.MenuItemPortion =OE_Sales_Activity.FP_SKU)

标签: androiddatabasesqlite

解决方案


我相信以下内容可能符合您想要的内容(根据

我想要一个 SQLite 查询,它将第一个表 A 中的每个类别、菜单和数量复制到第三个表 C 中,并匹配表 B 中的相应物料清单。

):-

INSERT INTO tablec 
SELECT category, tablea.menu, quantity, bill_of_material
FROM tablea JOIN tableb on tableb.menu = tablea.menu;
  • 根据您的示例数据记下表名。

基于稍微修改的一组示例数据(表b中的更多数据)考虑以下内容:-

-- DROP tables (note tableb as it references table should be dropped first)
DROP TABLE IF EXISTS tableb;
DROP TABLE IF EXISTS tablea;
DROP TABLE IF EXISTS tablec;
-- Create the tables
CREATE TABLE IF NOT EXISTS tablea (category TEXT, menu TEXT UNIQUE, quantity INTEGER);
CREATE TABLE IF NOT EXISTS tableb (menu TEXT REFERENCES tablea(menu), bill_of_material);
CREATE TABLE IF NOT EXISTS tablec (category, menu, quatity, bom);
-- Populate the tables, tablea and tableb
INSERT INTO tablea VALUES
    ('Chicken','ChickenStew',7),('Beef','Stew',10),('Fish','FishStew',8),('Chicken','Chicken Stew',5),('Fish','Fish Stew',2);
;
INSERT INTO tableb VALUES
    ('Chicken Stew','chicken'),('Chicken Stew','sauce'),('Chicken Stew','salt'),
    ('ChickenStew','chicken legs'),('ChickenStew','chicken stock'),('ChickenStew','Leek'),
    ('FishStew','Fish'),('FishStew','fish stock'),('FishStew','onion')
;
SELECT * FROM tablea; -- <<<<<<<<<< result 1
SELECT * FROM tableb; --<<<<<<<<<< result 2
DELETE FROM tablec; -- <<<<<<<<<< Clear tablec >>>>>>>>>
-- populate tablec according to tablea and tableb
INSERT INTO tablec 
SELECT category, tablea.menu, quantity, bill_of_material
FROM tablea JOIN tableb on tableb.menu = tablea.menu;

SELECT * FROM tablec; -- <<<<<<<<<< result 3

以上将表格填充为:-

在此处输入图像描述

和 tableb (带有更全面示例的附加数据)为:-

在此处输入图像描述

并且 tablec 根据 tablea 和 tablec 被填充为:-

在此处输入图像描述

  • 请注意,要利用外键(REFERENCES),您必须专门打开外键支持。
    • 在没有打开外键支持的情况下,上述操作仍然有效。但是,可以向 tableb 添加一行,其中菜单列(例如 FishBroth)不是 tablea 中的菜单项。

我不相信你想要更新,至少在没有合适的 WHERE 子句的情况下不会,否则 ALL ROWS 将被更新,将所有行的RawMatType列设置为相同的值。


推荐阅读