【问题标题】:Inner join of child table with parent table子表与父表的内连接
【发布时间】:2014-03-11 13:44:31
【问题描述】:

我有两个表,通过外键关联。我想根据有关父表中一行的一些信息从子表中选择一列。

表格的定义是:

CREATE TABLE Runs(
    id            INTEGER, 
    name          TEXT UNIQUE NOT NULL, 
    rundate       TEXT NOT NULL,
    PRIMARY KEY (id)
);


CREATE TABLE Location(
    lid           INTEGER, 
    rid           INTEGER NOT NULL,
    direc         TEXT NOT NULL,
    PRIMARY KEY (lid), 
    FOREIGN KEY (rid) REFERENCES Runs(id)
);

我是 SQL 新手,所以我还没有完全弄清楚如何做到这一点。这是我到目前为止所拥有的(假设我想获取名为 012114 的运行目录:

SELECT direc FROM Location INNER JOIN Runs WHERE Runs.name = '012114';

我也试过

SELECT direc FROM Location INNER JOIN (SELECT * FROM Runs WHERE Name = '012114');

这两种尝试都列出了 Location 表中 direc 列中的所有条目。我正在使用sqlite。

【问题讨论】:

  • 您实际上并没有加入。你需要像ON runs.<some column> = location.<some column> 这样的东西。

标签: sql select sqlite inner-join


【解决方案1】:

您可能缺少连接命令的一部分,您告诉 sqllite 如何合并表,因此您得到的是笛卡尔连接。

SELECT direc FROM Location 
  INNER JOIN Runs 
  ON location.rid = Runs.id WHERE Runs.name = '012114';

这应该可以工作,假设 location.rid 是对运行的引用。

【讨论】:

    【解决方案2】:

    当您执行JOIN 子句时,您需要指定要连接每个表上的哪些列。

    例如:

    SELECT direc 
    FROM Location 
    INNER JOIN Runs ON Runs.id = Location.rid
    WHERE Runs.name = '012114';
    

    没有这个,你可能会返回非常意想不到的结果。

    【讨论】:

      【解决方案3】:

      如果您不使用运行表中的列,则可以通过其他方式获得解决方案。 例如:

      SELECT
        direc 
      FROM 
         Location loc
      WHERE 
         Exists (SELECT NULL 
      FROM Runs ru WHERE ru.id =  loc.rid AND ru.name = '012114')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-29
        • 2012-11-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        相关资源
        最近更新 更多