2014-02-12 2 views
0

У меня есть две таблицы, связанные с внешним ключом. Я хочу выбрать столбец из дочерней таблицы на основе некоторой информации о строке в родительской таблице.Внутреннее соединение дочерней таблицы с родительской таблицей

Определения таблиц:

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. Я использую SQLite.

+0

Вы на самом деле не присоединяетесь. Вам понадобится что-то вроде 'ON работает. = местоположение. '. – Andrew

ответ

2

вы, вероятно, отсутствует часть присоединиться к команде, где вы рассказываете sqllite как объединить таблицы, так что вы получаете декартовой присоединиться.

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

Это должно работать, предполагая, что location.rid - это ссылка на прогон.

1

Когда вы делаете предложение JOIN, вам необходимо указать, какие столбцы для каждой таблицы должны быть объединены.

Например:

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

Без этого, вы можете вернуться совершенно неожиданные результаты.

0

Другой способ получить решение, если вы не используете столбцы из таблицы Runs. Пример:

SELECT 
    direc 
FROM 
    Location loc 
WHERE 
    Exists (SELECT NULL 
FROM Runs ru WHERE ru.id = loc.rid AND ru.name = '012114') 
Смежные вопросы