2014-09-23 4 views
-1

Я хотел бы построить сложный SQL-запрос.COMPLEX SQL/SELECT - INNER JOIN

Ссылка на изображение таблицы: http://i.stack.imgur.com/ZujIm.png (извините, что по каким-то причинам я не могу вставлять изображения).

Во-первых, я хотел бы, чтобы выбрать все записи, где column_1 и column_2 имеют сходную идентификатор друг друга и где Column_3 равно 1.

Таким образом, он должен возвращать только идентификаторы: 10000001 и 10000002, а не идентификаторами: 10000003 и 10000004, потому что id 10000004 имеет 2 в столбце_3 и поэтому не является обратным идентификатору 10000003.

Во-вторых, после того, как идентификаторы 10000001 и 10000002 выбраны из таблицы_1, я хотел бы получить данные из таблицы_2.

Таким образом, я хотел бы запрос, который помогает мне получать table_2.column_2 с идентификаторами в table_1 ГДЕ table_1.column_1 И table_1.column_2 имеют идентификаторы друг друга и table_column_3 равно 1.

Благодарности

ответ

0

Сделайте так: Он использует внутреннее соединение для переноса данных из одной таблицы со сравнением своих столбцов.

select * from table_2 
    where column_1 
    in 
    (
     select a.column_1 
     from table_1 a inner join table_1 b on a.column_1=b.column_2 and column_3=1 

    ) 

Дайте мне знать, если это сработает.

0

Я думаю, что ответ masum7 является правильным, кроме вас, вероятно, необходимо указать, что оба a.column_3 и b.column_3 равны 1.

Мне нравится вложенные запросы. В случае, если вы не можете или не хотите использовать их, вы можете сгладить его, как в следующем примере:

select t2.column_2 
from table_1 as t1a, table_1 as t1b, table_2 as t2 
where t1a.column_1 = t1b.column_2 and t1a.column_3 = 1 
and t1a.column_2 = t1b.column_1 and t1b.column_3 = 1 
and t1a.column_1=t2.column_1; 

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

+0

Спасибо, я получил его, чтобы работать так, как я хотел. – Joe

0

Это можно сделать разными способами. Пока решение masum7 vai кажется лучшим. Однако, кроме того, это может быть сделано следующим образом, а также:

SELECT * FROM table_2 as t2 
WHERE t2.column_1 IN 
(SELECT t1.column_1 FROM table_1 as t1 
WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1) 
AND t1.column_3 = 1) 

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

Первая часть:

SELECT * FROM table_2 as t2 

Собирается получить ВСЕ значения из table_2.

Но опять же, вы хотите, чтобы некоторые КОНКРЕТНЫЕ данные table_2 на основе некоторых КОНКРЕТНЫХ данных table_1. Итак, вот пункт WHERE и подзапрос для извлечения данных из table_1.

Вторая часть:

WHERE t2.column_1 IN 
    (SELECT t1.column_1 FROM table_1 as t1 
    WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1) 
    AND t1.column_3 = 1) 

Может быть разбит на дополнительные подразделы часть.

Подчасть - 1:

SELECT t1.column_1 FROM table_1 as t1 

Собирается получить ВСЕ значения column_1 из table_1.

Но это не то, что вы хотите. Вы хотите СПЕЦИАЛЬНО:

a. Эти значения column_1, которые присутствуют в column_2 и,
b. В то же время, эти значения column_1, для которых column_3 значение 1.

Основываясь на этих 2-х точках, приходит к югу часть 2.

Подчасть - 2:

WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1) 
    AND t1.column_3 = 1) 

Первая WHERE условие говорит, что значения column_1 должны находиться внутри вложенного подзапроса, который имеет все значения column_2. Второй говорит, что соответствующее значение column_3 должно быть 1.

Надеюсь, что этот запрос получит ваш ожидаемый результат и что вы поняли мое объяснение запроса. Удачи и приятного дня! Желаю вам приятного путешествия в StackOverflow. :)

EDIT-1:

Просто небольшое дополнение к запросу. Я забыл добавить статью GROUP BY. Это должно быть GROUP BYt2.column_1.

Таким образом, измененный запрос будет выглядеть так:

SELECT * FROM table_2 as t2 
WHERE t2.column_1 IN 
(SELECT t1.column_1 FROM table_1 as t1 
WHERE t1.column_1 IN (SELECT t1.column_2 FROM table_1 as t1) 
AND t1.column_3 = 1) 
GROUP BY t2.column_1 

К сожалению, я пропустил его. :)