SQL将关系表合并为单独的列

SQL将关系表合并为单独的列,sql,sql-server,Sql,Sql Server,我有这两张桌子 Items ID Type ClientID ======================== 1 0 123 2 0 123 Texts ItemID Language Text ================================ 1 Eng Hi there! 1 Spa Holla! 2

我有这两张桌子

 Items
 ID     Type     ClientID
 ========================
 1      0        123
 2      0        123

 Texts
 ItemID   Language     Text
 ================================
 1        Eng          Hi there!
 1        Spa          Holla!
 2        Eng          bye!
 2        Spa          bye in Spanish!
在我的最终结果中,我等待SQL返回这个表

 ID      Type    Eng           Spa
 ================================
 1       0        Hi there!     Holla!
 2       0         Bye!          bye in Spanish!
我试图创建以下语句:

 SELECT DISTINCT I.ID ,I.Type,
 (SELECT T.Text WHERE D.Language='Eng') AS 'Eng',
 (SELECT T.Text WHERE D.Language='Spa') AS 'Spa'
 FROM Items I
 INNER JOIN Texts T ON I.ID=T.ItemID
但我得到的结果是:

 ID      Type    Eng           Spa
 ================================
 1       0        Hi there!     NULL
 1       0        NULL          Holla!
 2       0        Bye!          NULL
 2       0        NULL          bye in Spanish!

我不明白为什么要加入。您可以只使用条件聚合:

select t.itemid,
       max(case when t.language = 'Eng' then t.text end) as Eng,
       max(case when t.language = 'Spa' then t.text end) as Spa
from texts t
group by t.itemid;

使用联接的解决方案看起来像

Select i.ID 
      ,i.[Type]
      ,t1.[Text] AS [Eng]
      ,t2.[Text] AS [Spa]
FROM Items i 
INNER JOIN Texts t1 ON i.ID = t1.ItemID AND t1.[Language] = 'Eng'
INNER JOIN Texts t2 ON i.ID = t2.ItemID AND t2.[Language] = 'Spa'

甚至可以使用动态sql查询

查询

DECLARE @query VARCHAR(MAX)

SELECT @query = 'SELECT t1.itemid, MAX(t2.[Type]) AS [Type], ' + 
      STUFF
      (
         (
            SELECT DISTINCT ',MAX(CASE WHEN t1.[language] =  '''+ [language] 
              + ''' THEN t1.[Text] END) AS ' + [Language]
            FROM Texts 
            FOR XML PATH('')
          ),
      1,1,'');
SELECT @query += ' FROM texts t1 JOIN items t2 ON t1.ItemId = t2.ID GROUP BY t1.itemid;';

EXECUTE(@query);

使用嵌套在具有筛选器(where子句)的同一个表上创建两个联接。 下面我已经在MySQL上进行了测试

SELECT 
    i.id, eng_table.text AS eng, spa_table.text AS spa
FROM
    i
        LEFT OUTER JOIN
    (SELECT 
        ItemID AS ID, Text
    FROM
        t
    WHERE
        Language = 'ENG') AS eng_table ON i.id = eng_table.id
        LEFT OUTER JOIN
    (SELECT 
        ItemID AS ID, Text
    FROM
        t
    WHERE
        Language = 'SPA') AS spa_table ON i.id = spa_table.id
问候,,
Bikxs

加入两次文本。对不起,伙计们-我需要加入,因为我需要来自项目的类型
SELECT 
    i.id, eng_table.text AS eng, spa_table.text AS spa
FROM
    i
        LEFT OUTER JOIN
    (SELECT 
        ItemID AS ID, Text
    FROM
        t
    WHERE
        Language = 'ENG') AS eng_table ON i.id = eng_table.id
        LEFT OUTER JOIN
    (SELECT 
        ItemID AS ID, Text
    FROM
        t
    WHERE
        Language = 'SPA') AS spa_table ON i.id = spa_table.id