2013-06-01 3 views
1

Ниже приведен пример таблиц:Объединение двух таблиц на основе двух общих столбцов, которые появляются под разными названиями в каждой таблице

клиенты

╔══════════╦════════════╗ 
║ GROUP_ID ║ GROUP_NAME ║ 
╠══════════╬════════════╣ 
║ abc  ║ xex  ║ 
║ def  ║ tet  ║ 
╚══════════╩════════════╝ 

команды

╔════════╦════════════╗ 
║ ACT_ID ║ GROUP_NAME ║ 
╠════════╬════════════╣ 
║  44 ║ xex  ║ 
║  32 ║ tet  ║ 
╚════════╩════════════╝ 

действия

╔════╦════════════╗ 
║ ID ║ STATE ║ 
╠════╬════════════╣ 
║ 44 ║ complete ║ 
║ 58 ║ incomplete ║ 
╚════╩════════════╝ 

Обратите внимание, что act_id в таблице teams также присутствует в таблице actions в id

Я хочу, чтобы выбрать таблицу с двумя столбцами: group_id и group_name, где каждый group_name имеет act_id, который имеет полныйstate.

Я делаю что-то вроде:

SELECT group_id AND group_name 
FROM clients 
WHERE group_name IN (SELECT group_name 
        FROM teams, actions 
        WHERE teams.act_id = actions.id 
         AND actions.state IS complete) 

Является ли это правильно?

Я также думал, что-то вроде

SELECT group_id AND group_name 
FROM clients 
WHERE group_name IN (SELECT group_name 
        FROM teams 
        WHERE act_id IN (SELECT id 
             FROM actions 
             WHERE teams.act_id = actions.id. 
             AND state IS complete)) 

Является либо из вышеперечисленного правильно?

В таблице Я ищу, чтобы получить это, очевидно, это одна:

╔══════════╦════════════╗ 
║ GROUP_ID ║ GROUP_NAME ║ 
╠══════════╬════════════╣ 
║ abc  ║ xex  ║ 
╚══════════╩════════════╝ 

ответ

3
SELECT a.* 
FROM clients a 
     INNER JOIN teams b 
      ON a.group_name = b.group_name 
     INNER JOIN actions c 
      ON b.act_ID = c.id 
WHERE c.state = 'complete' 

Звездочка * вы видите на запрос SQL означает, что она будет выбирать все доступные столбцы, в этом случае все они будут выбираться из таблицы clients. Если вы хотите выбрать только для определенного столбца, используйте comma для разделения не AND. например,

SELECT a.GROUP_ID, a.GROUP_NAME 
FROM clients a 
     INNER JOIN teams b 
      ON a.group_name = b.group_name 
     INNER JOIN actions c 
      ON b.act_ID = c.id 
WHERE c.state = 'complete' 

Для дальнейшего получить больше знаний о соединяющую, любезно перейдите по ссылке ниже:

+0

Спасибо большое вам ответить JW. Используемые вами a, b и c - это просто случайные имена, которые вы назначаете для каждой таблицы, чтобы вы могли легко идентифицировать их и провести различие между ними в вашем запросе? Не могли бы вы также дать мне вышеуказанный запрос, используя мой собственный более подробный формат (без JOINS, просто используя WHERE, IN, IS, IS NOT, =), чтобы я мог лучше понять, что вы делаете? Или это невозможно без JOINs? Еще раз спасибо, и я обязательно посмотрю на ПРИСОЕДИНЯЕМЫЕ. –

+0

'a, b, c' называются' ALIAS' (* или псевдонимы в терминах имени человека *). Существует множество возможных запросов для достижения определенного результата. Тот, который мне больше всего нравится, - это «JOIN». Это также можно сделать с помощью 'EXISTS'. ';)' –

Смежные вопросы