根据另一列的值将一个 SQL 列拆分成两个。

3
我有一个如下所示的SQL数据库设置:
#1格式
表格1:(值)
列1(值)| 列2(标识符)
Title_Name | Collection_Title Title_Name | Collection_Title Image_URL | Collection_Image Image_URL | Collection_Image
我想将这两列拆分为四个独立的列,如下所示:
#2格式
表格2:(值)
VALUE #1 | IDENTIFIER #1 | VALUE #2 | IDENTIFIER #2
Image_URL | Collection_Image | Title_Name | Collection_Title Image_URL | Collection_Image | Title_Name | Collection_Title 到目前为止,我有以下查询:
SELECT  value, identifier
FROM [tableName]
WHERE identifier IN ('Image_URL', 'Title_Name');

它正在返回#1格式,所以我从查询中返回所有信息。问题是我想将其呈现为#2查询,每个列都有一个唯一的名称。

如何扩展或改进我的查询以返回#2格式?

谢谢 :)


1
这是不可能的,因为您的模式没有将Image_URL与Title_Name在单行中关联的条件。 - Slava Rozhnev
我不确定我完全理解你的意思。你是说将这两列分成四列不可能吗? - BoogaBooga
你如何确定第一个表格第三行的Image_URL会放到结果表格的第一行而不是第二行? - Salman A
1
当Image_URL的数量不等于Title_Name的数量时,应该怎么办? - Slava Rozhnev
我认为需要一些实际的样本数据和预期结果来理解如何拆分和连接这些数据,或者"image_URL"是实际重复的数据吗? - Stu
显示剩余4条评论
2个回答

2

您可以使用CROSS JOIN获得笛卡尔积:

SELECT * FROM (
  SELECT  value, identifier
  FROM [tableName]
  WHERE identifier = 'Collection_Image'
) Images
CROSS JOIN (
  SELECT  value, identifier
  FROM [tableName]
  WHERE identifier = 'Collection_Title'
) Titles;

结果:

+============+==================+=============+==================+
| value      | identifier       | value       | identifier       |
+============+==================+=============+==================+
| Image_URL1 | Collection_Image | Title_Name1 | Collection_Title |
+------------+------------------+-------------+------------------+
| Image_URL2 | Collection_Image | Title_Name1 | Collection_Title |
+------------+------------------+-------------+------------------+
| Image_URL1 | Collection_Image | Title_Name2 | Collection_Title |
+------------+------------------+-------------+------------------+
| Image_URL2 | Collection_Image | Title_Name2 | Collection_Title |
+------------+------------------+-------------+------------------+

SQL笛卡尔积演示

您也可以使用ROW_NUMBER函数作为连接条件:

SELECT Images.value, Images.identifier, Titles.value, Titles.identifier  
FROM (
  SELECT  value, identifier, row_number() over(order by value) rn
  FROM [tableName]
  WHERE identifier = 'Collection_Image'
) Images
FULL OUTER JOIN (
  SELECT  value, identifier, row_number() over(order by value) rn
  FROM [tableName]
  WHERE identifier = 'Collection_Title'
) Titles ON Images.rn = Titles.rn;

FULL OUTER JOIN


谢谢你,Slava!是的,这个方法很管用!你能否进一步帮助我并解释一下你的思路?如果我理解正确的话,你基本上构建了两个查询,然后将它们合并在一起? - BoogaBooga
1
是的,你是正确的。生成2个查询,产生2个数据集并联接它们。再看一个FULL OUTER JOIN的例子。 - Slava Rozhnev

2
您可以为每个值组分配一个顺序号,并使用完全连接。这将给出精确的结果,或者在匹配行不平衡时给出null
with image as (
    select [value] Value1, identifier Identifier1, Row_Number() over(order by value) rn
    from t
    where [value] = 'Image_URL'
), title as (
    select [value] Value2, identifier Identifier2, Row_Number() over(order by value) rn
    from t
    where [value] = 'Title_Name'
)
select  value1,identifier1, value2, identifier2
from image i 
full join title t on t.rn=i.rn

演示代码

请注意,此演示使用的是Sql Server(未指定特定的RDBMS),但兼容大多数数据库。


嗨,Stu,谢谢你的回答。我正在努力实现它 :) - BoogaBooga

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接