代码之家  ›  专栏  ›  技术社区  ›  Chang

SQLITE:选择共享相同外键的所有项目

  •  0
  • Chang  · 技术社区  · 8 年前

    我对 SQL Sqlite 然而,我可能做得不对,出于学术原因,我正试图通过自己创建的一个肮脏的数据库来学习基础知识。如果词汇不正确,请原谅,我还在学习过程中。

    我创建了一组表,每个表都有不同类型的实体,但它们都有相似之处:它们共享同一个对象的多个实例 Foreign Key 具有不同的值。

    表M1:包含2项的实体:

    +------------+---------+--------+-------+
     Primary Key  Unique ID   Data1   Data2
    +------------+---------+--------+-------+
          1          x1      103021   103022     
    

    表M2:包含3项的实体:

    +------------+---------+--------+-------+-------+
     Primary Key  Unique ID   Data1   Data2   Data3
    +------------+---------+--------+-------+-------+
          1          y1      103021   103022  103001        
    

    之前的所有数据列都是 Foreign Keys 到a Unique Key 下文(表N):

    +------------+---------+--------+-------+
     Primary Key  Unique ID   Data1   Data2
    +------------+---------+--------+-------+
          1         100002     ...     ...
          2         103001     ...     ...
          3         103021     ...     ...
          4         103022     ...     ...
    

    我所需要做的就是提取共享给定唯一项(My)的所有实体 外键 ). 例如,给定 103022 将提供两个实体: x1 y1 .

    现在我已经尝试了几天,我已经设法通过 JOIN 陈述

    内部联接:

    SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id
    

    交叉连接:

    SELECT N.id, T1.id FROM N CROSS JOIN M1 as T1 WHERE T1.data1=N.id OR T1.data2=N.id
    

    INNER JOIN 只有当我一次只做一个表,并用python实时对其进行后处理时,才会起作用,我理解这一点 CROSS JOIN 生成数据的笛卡尔积,在添加其他表和布尔条件时,很容易使用太多内存。所以我认为这不是一个选择。

    还有其他我没有想到的方法吗?

    谢谢大家!

    1 回复  |  直到 8 年前
        1
  •  1
  •   Pranay Rana    8 年前

    我想你在找 Union 表的

    SELECT N.id, T1.id FROM N INNER JOIN M1 as T1 on T1.data1=N.id OR T1.data2=N.id
    Union
    SELECT N.id, T1.id FROM N INNER JOIN M2 as T1 on T1.data1=N.id OR T1.data2=N.id
    

    注意:考虑到N是主表,M1是其他要连接的表。