【问题标题】:SQL join row contents to another table's column namesSQL 将行内容连接到另一个表的列名
【发布时间】:2016-06-02 21:11:25
【问题描述】:

假设我有以下两个表:

       **Table A**       

ID   Day   Month   Year           
------------------------       
1    1      1       1900
3    13     3       2009
49   28     2       1984


                      **Table B**     

ID   ABC_1_1_1900   ABC_2_1_1900 ...  ABC_31_12_2100           
-------------------------------- ... ---------------       
1        431            15449             98565
2                
3                       ....
.
.
n                                         ....

并希望得到下表:

      **Table C**     

ID        ABC           
------------------------       
1         431
3         (value B.ABC_13_3_2009 for ID=3)
49        (value B.ABC_28_2_1984 for ID=49)

基本上我想要实现的是,通过将 A 的行内容与 B 的列名匹配并在 ID 上进行内部连接来获取表 B 的子集。

相当于

SELECT A.ID, B.CONCAT('ABC_', A.Day, '_', A.Month, '_', A.Year) AS ABC
FROM A
INNER JOIN B ON A.ID=B.ID

不幸的是,这不起作用。任何想法都非常感谢!

【问题讨论】:

  • 如果您的IDUNIQUE,那么您的INNER JOIN 将带回Table B 中的值。如果您只想要价值,为什么要尝试CONCAT()
  • 因为我只想要表B所有列中的一个值(假设表B有数千列),它对应于表A中的内容。
  • 见规范化。数据库表不是电子表格。数据类型的发明是有充分理由的。

标签: mysql sql sql-server database


【解决方案1】:

您要做的是从变量创建 SQL 语句。这如何完成取决于您使用的 SQL 技术。从标签中,我假设您使用 MySQL。使用 MySQL,您需要创建一个所谓的 Prepared Statement(注意:他们说这很 hacky,请参阅:mysql field name from variable)。使用准备好的语句,您将能够将列内容传递给您的 SQL 语句。所有这些看起来如下所示:

  • 创建 SQL 字符串:

SET @s = CONCAT('SELECT A.ID, B.ABC_', A.Day, '_', A.Month, '_', A.Year, ' AS ABC FROM A INNER JOIN B ON A.ID=B.ID');

  • 准备语句并执行:

PREPARE stmt FROM @s; EXECUTE stmt;

注意:请注意,这可能容易出错,因为列中的数字(例如天)的格式必须始终与列名称中的数字 (ABC_X_Y_Z) 相同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多