【问题标题】:SQL query subtable in columns from main query主查询列中的 SQL 查询子表
【发布时间】:2021-12-08 05:30:44
【问题描述】:

我有 2 个表,其中一个以唯一 UUID 作为索引的主表和一个包含主表 1 行语言的子表。

例如 表_1

uuid code
111-etc 123
222-etc 321

table_1_lang

uuid lang_code title
111-etc en english 123
111-etc de deutch 123
222-etc en english 321
222-etc de deutch 321

我想创建一个查询,每个主表 (table_1) 的结果为 1 行,并为每个 lang_code 添加额外的列。 我已经设法用硬编码的 lang_code 创建了接近最终结果的东西,但是 _lang 表可以是动态的(额外的语言),所以这不是我想要的。 结果一定是这样的:

结果:

uuid code title-en title-de
111-etc 123 english 123 deutch 123
222-etc 321 english 321 deutch 321

Tables

编辑:因为表格的布局似乎搞砸了,所以如图所示

感谢您的帮助。

【问题讨论】:

  • SQL 作为标签过于笼统。您可能需要应用标签来指示您的平台
  • 是的,也许您使用的 dbms 有 PIVOT?除了 没有其他标记,期待 ANSI/ISO SQL 答案!

标签: sql sql-server sql-server-2012


【解决方案1】:

首先,您需要使用 stuff 将定义的行转换为列名,然后使用 pivot 来满足您的要求。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols =  STUFF((SELECT ',' + QUOTENAME('title-'+lang_code) 
                    from table_1_lang
                    group by lang_code                    
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
        print @cols
set @query = N'SELECT uuid,code, ' + @cols + N' from 
             (
                select t1.uuid,t1.code,concat(''title-'',t2.lang_code) as lang_code,t2.title from table_1 t1
                inner join table_1_lang t2 on t1.uuid = t2.uuid
            ) x
            pivot 
            (
                max(title)
                for lang_code in (' + @cols + N')
            ) p '

print @query
exec sp_executesql @query;

【讨论】:

  • 嗨马尔维克,谢谢你的回答。我明天早上会测试这个。我让你知道它是否有效
  • 您好,我刚刚成功测试了您的答案。非常感谢您的帮助!
  • @pietvp 很高兴为您提供帮助,欢迎来到 Stack Overflow。如果此答案解决了您的问题,请将其标记为已接受。
【解决方案2】:

LEFT JOIN table_1_lang 表为每种语言一次:

select t.uuid, t.code, len.title, lde.title,
from table_1 t
left join table_1_lang len on t.uuid = len.uuid and len.lang_code = 'en'
left join table_1_lang lde on t.uuid = lde.uuid and lde.lang_code = 'de'

【讨论】:

  • 您好,感谢您的回答。那将是“硬编码”变体,但情况是语言表可能包含这些语言或尚不为人所知的语言“nl”、“fr”等。所以对于子语言表中的每种语言,我想有一个专栏。
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多