SQL 属于主 table 的查询列表作为主 table 上的列
SQL query lists belonging to main table as columns on main table
根据本主题中提出的问题,我有一个后续问题:
我已设法获得以下 table 以及上面主题中回答的查询:
uuid
code
title-en
title-de
111-etc
123
english 123
deutch 123
222-etc
321
english 321
deutch 321
在我已有的结果旁边我想扩展 SQL 以根据另一个 table.
向结果添加额外的(动态)列
Table_1 和 table_1_lang(当然)是一样的:
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_2(包含具有 0-n 个列表的动态列表)
uuid
list_code
value
order
111-etc
list_code_1
100
0
111-etc
list_code_2
50
1
222-etc
list_code_1
200
2
222-etc
list_code_2
30
0
222-etc
list_code_3
10
1
我要创建的结果(在上述结果旁边以及上一个主题中非常有用的答案)如下:
结果中列名中的“0”、“1”等是列表中的订单字段 table.
结果:
uuid
code
title-en
title-de
condition-0-list_code
condition-0-value
condition-1-list_code
condition-1-value
condition-2-list_code
condition-2-value
111-etc
123
english 123
deutch 123
list_code_1
100
list_code_2
50
222-etc
321
english 321
deutch 321
list_code_2
30
list_code_3
10
list_code_1
200
我非常努力地尝试根据我已经收到的查询获得结果,并认为它只是对先前查询的 'extension' 但我的 SQL 知识不是很好.
总结一下我真正需要的:
使用上述 tables:
- table_1
- table_1_lang
- table_2(table_1 中的每个 key/uuid 可以包含 0-n 行)
我想创建一组 'Result'。
'conditions' 的列名称必须根据值 'order' 和要在结果列中显示的列(list_code 和值)动态创建。
所以 uuid '111-etc' 在 table_2 中有 2 个条目,您将在结果的第 1 行看到这些值 -table.
'condition-2-list_code' 和 'condition-2-value' 在 uuid '111-etc' 的结果中为空,因为它们不存在于 table_2 中。对于 uuid '222-etc',这些值填入结果 table.
谁能帮帮我?非常感谢您的提前帮助,非常感谢。
您可以在 CROSS APPLY
内旋转。
对于两列数据透视表,通常只使用条件聚合会更容易 MAX(CASE WHEN
select
t.uuid,
t.code,
[title-en] = len.title,
[title-de] = lde.title,
cond.*
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'
CROSS APPLY (
SELECT
[condition-0-list_code] = MAX(CASE WHEN c.[order] = 0 THEN c.list_code END),
[condition-0-value] = MAX(CASE WHEN c.[order] = 0 THEN c.value END),
[condition-1-list_code] = MAX(CASE WHEN c.[order] = 1 THEN c.list_code END),
[condition-1-value] = MAX(CASE WHEN c.[order] = 1 THEN c.value END),
[condition-2-list_code] = MAX(CASE WHEN c.[order] = 2 THEN c.list_code END),
[condition-2-value] = MAX(CASE WHEN c.[order] = 3 THEN c.value END)
FROM table_2 c
WHERE c.uuid = t.uuid
) cond;
您也可以为 table_1_lang
执行此操作
根据本主题中提出的问题,我有一个后续问题:
我已设法获得以下 table 以及上面主题中回答的查询:
uuid | code | title-en | title-de |
---|---|---|---|
111-etc | 123 | english 123 | deutch 123 |
222-etc | 321 | english 321 | deutch 321 |
在我已有的结果旁边我想扩展 SQL 以根据另一个 table.
向结果添加额外的(动态)列Table_1 和 table_1_lang(当然)是一样的:
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_2(包含具有 0-n 个列表的动态列表)
uuid | list_code | value | order |
---|---|---|---|
111-etc | list_code_1 | 100 | 0 |
111-etc | list_code_2 | 50 | 1 |
222-etc | list_code_1 | 200 | 2 |
222-etc | list_code_2 | 30 | 0 |
222-etc | list_code_3 | 10 | 1 |
我要创建的结果(在上述结果旁边以及上一个主题中非常有用的答案)如下: 结果中列名中的“0”、“1”等是列表中的订单字段 table.
结果:
uuid | code | title-en | title-de | condition-0-list_code | condition-0-value | condition-1-list_code | condition-1-value | condition-2-list_code | condition-2-value |
---|---|---|---|---|---|---|---|---|---|
111-etc | 123 | english 123 | deutch 123 | list_code_1 | 100 | list_code_2 | 50 | ||
222-etc | 321 | english 321 | deutch 321 | list_code_2 | 30 | list_code_3 | 10 | list_code_1 | 200 |
我非常努力地尝试根据我已经收到的查询获得结果,并认为它只是对先前查询的 'extension' 但我的 SQL 知识不是很好.
总结一下我真正需要的: 使用上述 tables:
- table_1
- table_1_lang
- table_2(table_1 中的每个 key/uuid 可以包含 0-n 行)
我想创建一组 'Result'。
'conditions' 的列名称必须根据值 'order' 和要在结果列中显示的列(list_code 和值)动态创建。
所以 uuid '111-etc' 在 table_2 中有 2 个条目,您将在结果的第 1 行看到这些值 -table.
'condition-2-list_code' 和 'condition-2-value' 在 uuid '111-etc' 的结果中为空,因为它们不存在于 table_2 中。对于 uuid '222-etc',这些值填入结果 table.
谁能帮帮我?非常感谢您的提前帮助,非常感谢。
您可以在 CROSS APPLY
内旋转。
对于两列数据透视表,通常只使用条件聚合会更容易 MAX(CASE WHEN
select
t.uuid,
t.code,
[title-en] = len.title,
[title-de] = lde.title,
cond.*
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'
CROSS APPLY (
SELECT
[condition-0-list_code] = MAX(CASE WHEN c.[order] = 0 THEN c.list_code END),
[condition-0-value] = MAX(CASE WHEN c.[order] = 0 THEN c.value END),
[condition-1-list_code] = MAX(CASE WHEN c.[order] = 1 THEN c.list_code END),
[condition-1-value] = MAX(CASE WHEN c.[order] = 1 THEN c.value END),
[condition-2-list_code] = MAX(CASE WHEN c.[order] = 2 THEN c.list_code END),
[condition-2-value] = MAX(CASE WHEN c.[order] = 3 THEN c.value END)
FROM table_2 c
WHERE c.uuid = t.uuid
) cond;
您也可以为 table_1_lang