2016-03-09 2 views
3

Предположим, у меня есть две таблицы, как показано ниже:Append родительской таблицы значение столбца для столбца дочерней таблицы в SQL

Таблица 1

ID   Name 
------------------ 
1   Adam 
2   Eve 

Таблица 2

ID   FK_ID (Table 1)   Name 
-------------------------------------------- 
1     1     Chris 
2     1     Austin 
3     1     Steve 
4     2     Charles 
5     2     Erik 
6     2     Austin 

Требуемые таблицы, как результат

ID   Name 
----------------- 
1   Chris 
2   Austin Adam 
3   Steve 
4   Charles 
5   Erik 
6   Austin Eve 

Уведомление здесь, в результирующей таблице, я хочу повторить «Остин», прилагаемый к «Адам/Ева» из родительской таблицы (т. Таблица 1), в зависимости от «FK_ID». Я хочу сделать это в SQL. Любая идея/помощь действительно оценили бы.

ответ

2

Вы можете использовать счетчик окна, чтобы определить, повторяется ли имя или нет:

SELECT t2.ID, 
     CONCAT(t2.Name, 
      IIF(COUNT(t2.Name) OVER(PARTITION BY t2.Name) > 1, 
       COALESCE(' ' + t1.Name, ''), 
       '')) 
FROM TABLE2 AS t2 
LEFT JOIN TABLE1 AS t1 ON t2.FK_ID = t1.ID 
+0

здорово, если вы просто изменить '' IIF' в CASE' и использовать '+ ', это будет работать на всех версиях SQL Server 2005 + (так как вопрос не помечен какой-либо конкретной версией) – ughai

+0

По совпадению основная идея разделяется всеми ответами. Но я ценю технику, которую вы использовали для решения этой проблемы. Это действительно хорошо. –

0
SELECT ID,NAME 
    FROM TABLE2 
    WHERE NAME NOT IN (
     SELECT NAME 
     FROM TABLE2 
     GROUP BY NAME 
     HAVING COUNT(*) >1) 
    UNION 
    SELECT A.ID AS ID,A.NAME+' '+B.NAME AS NAME 
    FROM TABLE2 AS A INNER JOIN TABLE1 AS B 
    ON A.FK_ID = B.ID 
    WHERE NAME IN (
     SELECT NAME 
     FROM TABLE2 
     GROUP BY NAME 
     HAVING COUNT(*) >1) 
    ORDER BY ID 

Использование союза для обработки логики двумя группами.

4

Вы можете использовать GROUP BY Name проверить имена с count(*) > 1, а затем сделать LEFT JOIN добавлять T1 имена надлежащим

Примеры данных

CREATE TABLE Table1 
    ([ID] int, [Name] varchar(4)); 

INSERT INTO Table1 
    ([ID], [Name]) 
VALUES 
    (1, 'Adam'), 
    (2, 'Eve'); 

CREATE TABLE Table2 
    ([ID] int, [FK_ID] int, [Name] varchar(7)); 

INSERT INTO Table2 
    ([ID], [FK_ID], [Name]) 
VALUES 
    (1, 1, 'Chris'), 
    (2, 1, 'Austin'), 
    (3, 1, 'Steve'), 
    (4, 2, 'Charles'), 
    (5, 2, 'Erik'), 
    (6, 2, 'Austin'); 

Запрос

SELECT 
    T2.ID, 
    T2.Name + CASE WHEN T3.Name IS NOT NULL THEN ' ' + T1.Name ELSE '' END as Name 
FROM Table2 T2 
INNER JOIN Table1 T1 ON T2.[FK_ID] = T1.id 
LEFT JOIN (SELECT Name FROM Table2 GROUP BY Name HAVING COUNT(*) > 1) T3 ON T2.Name = T3.Name 

Выход

ID Name 
1 Chris 
2 Austin Adam 
3 Steve 
4 Charles 
5 Erik 
6 Austin Eve 
Смежные вопросы