簡體   English   中英

SQL 視圖連接 3 個表,但有多個列用於 ON 子句

[英]SQL view to join 3 tables, but there are multiple columns to use for the ON clause

我們在 PostgreSQL 中有一個數據庫,用於獲取電池信息。

  1. 材料(化工原料)
  2. 由原材料制成的電極(陰極或陽極)
  3. 由電極和電解質(材料)制成的電池

每個表中有一個唯一的“鍵”(第一列)來標識該項目。 所以電極將指向材料。 問題在於,陰極和陽極列單元表都引用了電極表(以及指向材料的電極中的粘合劑、活性材料、溶劑)。

我目前的觀點是這樣的。 但我知道這是不正確的:

CREATE OR REPLACE VIEW se3d.m2elect2cell AS
SELECT 
    m."Key" as "Mat Key",
    m."Chemical",
    m."Description" as "Material Description",
    e."Description" as "Electrode Description",
    e."Role" as "Electrode Role",
    c."Key" as "Cell Key",
    c."Description" as "Cell Description"
FROM se3d.materials m
    INNER JOIN se3d.electrodes e ON (e."Active Material" = m."Key")
    INNER JOIN se3d.cells c ON (c."Cathode" = e."Key")

我們正在尋找的查詢類型是查找具有特定材料屬性的所有單元格,或者從單元格查找其制造中使用的材料。

相關表的定義如下所示:

CREATE TABLE se3d.materials
(
    "Key" character varying COLLATE pg_catalog."default" NOT NULL,
    "Chemical" character varying(255) COLLATE pg_catalog."default",
    "Description" character varying(255) COLLATE pg_catalog."default",
    "Created" date,
    "Created By" character varying(255) COLLATE pg_catalog."default",
    "Modified" date,
    "Modified By" character varying(255) COLLATE pg_catalog."default",
    "Version" double precision,
    "Chemical Type" character varying(255) COLLATE pg_catalog."default",
    "Storage" character varying(255) COLLATE pg_catalog."default",
    "Tags" character varying(255) COLLATE pg_catalog."default",
    CONSTRAINT materials_pkey PRIMARY KEY ("Key")
)

CREATE TABLE se3d.electrodes
(
    "Key" character varying COLLATE pg_catalog."default" NOT NULL,
    "Active Material" character varying(255) COLLATE pg_catalog."default",
    "Active Material mass (g)" double precision,
    "Binder" character varying(255) COLLATE pg_catalog."default",
    "Binder mass (g)" double precision,
    "Conductive Additive" character varying(255) COLLATE pg_catalog."default",
    "Carbon mass (g)" double precision,
    "Created" date,
    "Created By" character varying(255) COLLATE pg_catalog."default",
    "Creator" character varying(255) COLLATE pg_catalog."default",
    "Description" character varying(255) COLLATE pg_catalog."default",
    "Modified" date,
    "Modified By" character varying(255) COLLATE pg_catalog."default",
    "Role" character varying(255) COLLATE pg_catalog."default",
    "Solvent" character varying(255) COLLATE pg_catalog."default",
    "Solvent mass (g)" double precision,
    "Version" double precision,
    "Creation Date" date,
    "Tags" character varying(255) COLLATE pg_catalog."default",
    CONSTRAINT electrodes_pkey PRIMARY KEY ("Key")
)
CREATE TABLE se3d.cells
(
    "Key" character varying COLLATE pg_catalog."default" NOT NULL,
    "Creator" character varying(255) COLLATE pg_catalog."default",
    "Creation Date" date,
    "Electrolyte" character varying(255) COLLATE pg_catalog."default",
    "Anode" character varying(255) COLLATE pg_catalog."default",
    "Cathode" character varying(255) COLLATE pg_catalog."default",
    "Separator" character varying(255) COLLATE pg_catalog."default",
    "Form Factor" character varying(255) COLLATE pg_catalog."default",
    "Test Plan" character varying(255) COLLATE pg_catalog."default",
    "Description" character varying(255) COLLATE pg_catalog."default",
    "Created" date,
    "Created By" character varying(255) COLLATE pg_catalog."default",
    "Modified" date,
    "Modified By" character varying(255) COLLATE pg_catalog."default",
    "Version" double precision,
    "Tags" character varying(255) COLLATE pg_catalog."default",
    CONSTRAINT cells_pkey PRIMARY KEY ("Key")
)

如果您將電極角色扮演為陽極和陰極...

SELECT 
    m."Key" as "Mat Key",
    m."Chemical",
    m."Description" as "Material Description",
    anode."Description" as "Anode Description",
    anode."Role" as "Anode Role",
    cathode."Description" as "Cathode Description",
    cathode."Role" as "Cathode Role",
    c."Key" as "Cell Key",
    c."Description" as "Cell Description"
FROM se3d.materials m
    INNER JOIN se3d.electrodes anode ON (anode."Active Material" = m."Key")
    INNER JOIN se3d.electrodes cathode ON (cathode."Active Material" = m."Key")
    INNER JOIN se3d.cells c ON (c."Cathode" = cathode."Key")
                            or (c."Anode" = anode."Key")

我們正在尋找的查詢類型是查找具有特定材料屬性的所有單元格,或者從單元格查找其制造中使用的材料。

您可能找不到一種視圖來有效地滿足這兩種用途。 您可能需要多個視圖,或者直接編寫所需的查詢並在沒有視圖的情況下運行它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM