SQL 在主查询的列中查询子表
SQL query subtable in columns from main query
我有 2 个 tables,其中一个主 table 以唯一的 UUID 作为索引,一个子 table 包含主 [=42= 的 1 行语言].
例如
table_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 (table_1) 的结果为 1 行,并为每个 lang_code 添加额外的列。
我已经设法用硬编码 lang_code 创建了一些接近最终结果的东西,但是 _lang table 可以是动态的(额外的语言)所以这不是我想要的。
结果必须是这样的:
结果:
uuid
code
title-en
title-de
111-etc
123
english 123
deutch 123
222-etc
321
english 321
deutch 321
Tables
编辑:如图所示,因为 table 的布局似乎搞砸了
感谢您的帮助。
LEFT JOIN
table_1_lang table 每种语言一次:
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'
首先,您需要使用 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;
我有 2 个 tables,其中一个主 table 以唯一的 UUID 作为索引,一个子 table 包含主 [=42= 的 1 行语言].
例如 table_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 (table_1) 的结果为 1 行,并为每个 lang_code 添加额外的列。 我已经设法用硬编码 lang_code 创建了一些接近最终结果的东西,但是 _lang table 可以是动态的(额外的语言)所以这不是我想要的。 结果必须是这样的:
结果:
uuid | code | title-en | title-de |
---|---|---|---|
111-etc | 123 | english 123 | deutch 123 |
222-etc | 321 | english 321 | deutch 321 |
Tables
编辑:如图所示,因为 table 的布局似乎搞砸了
感谢您的帮助。
LEFT JOIN
table_1_lang table 每种语言一次:
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'
首先,您需要使用 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;