сопоставить один столбец одной таблицы с данными другой таблицы - PullRequest
1 голос
/ 19 декабря 2011

У меня есть 2 таблицы - table1 и table2. Таблица1 является следующим:

ID
A01
A02
A03
A04
A05

таблица2 является следующим:

DeptID  Name        ID
5       groupA      A01
5       groupA      A03
5       groupA      A04
5       groupB      A02
5       groupB      A04
5       groupB      A05

Таблица3:

Codename    DisplayName
groupA      Humti
groupB      Dumpti

хочу выводить как:

DeptID  Name         ID    Result
5       Humpti       A01   1
5       Humpti       A02   0
5       Humpti       A03   1
5       Humpti       A04   1
5       Humpti       A05   0
5       Dumpti       A01   0
5       Dumpti       A02   1
5       Dumpti       A03   0
5       Dumpti       A04   1
5       Dumpti       A05   1

Здесь к группе А прикреплено 3 идентификатора. A01, A03, A04. Таким образом, для них столбец результата в выходных данных имеет значение 1. Но для A02 A05 groupA не связан, поэтому значение столбца результата равно 0. Единственное, что нам нужно помнить, это то, что groupA будет сравниваться со всеми идентификаторами таблицы 1.

Редактировать : Все решения работали довольно хорошо, но можно ли заменить 'groupA' на 'Humpti' и 'groupB' на 'Dumpti', основываясь на значениях, найденных в таблице3 ??

спасибо ..

Ответы [ 3 ]

2 голосов
/ 19 декабря 2011
SELECT t2.deptId, t2.name, table1.id, CASE WHEN table2.id IS NULL THEN 0 ELSE 1 END result
FROM table1, (SELECT distinct deptId, group from table2) t2
LEFT OUTER JOIN table2 ON t2.name = table2.name AND t2.ID = table1.ID

РЕДАКТИРОВАТЬ, для вашей измененной проблемы:

SELECT t2.deptId, table3.name, table1.id, CASE WHEN table2.id IS NULL THEN 0 ELSE 1 END result
FROM table1, table3, (SELECT distinct deptId, name from table2) t2
LEFT OUTER JOIN table2 ON t2.name = table2.name AND t2.ID = table1.ID
WHERE table3.codename = t2.name
1 голос
/ 19 декабря 2011
SELECT ddn.DeptID
     , ddn.Name
     , did.ID
     , CASE WHEN t2.id IS NOT NULL 
              THEN 1 
              ELSE 0 
       END AS Result
FROM 
     table1 AS did
  CROSS JOIN
    ( SELECT DISTINCT 
          DeptID
        , Name
      FROM table2
    ) AS ddn
  LEFT JOIN table2 AS t2 
    ON  t2.ID = did.ID
    AND t2.DeptID = ddn.DeptID
    AND t2.Name = ddn.Name
1 голос
/ 19 декабря 2011

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

select 
    sub.*,
    result = case when t.ID is null then 0 else 1 end
from 
    (
    select distinct
        t2.DeptID,
        t2.Name,
        t1.ID
    from
        table1 t1,
        table2 t2
) sub
left join table2 t on sub.ID = t.ID and sub.name = t.name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...