【问题标题】:SQL inner join two tables with the same column namesSQL内部连接两个具有相同列名的表
【发布时间】:2010-07-29 17:49:25
【问题描述】:

我有两张表,列的数量可变。 (我不知道有多少列或有什么名称)例如表 A 和表 B。

表A:

ID | B_ID | {variable} 

表B

ID | {variable} 

查询:

SELECT TableA.*, TableB.* FROM TableA INNER JOIN TableB ON TableA.B_ID= TableB.id;

当 TableA 和 TableB 都有同名的列时,我无法区分这两个不同的列。例如,两个表都有列“名称”,此查询将导致:

ID | ID | B_ID | NAME | NAME |
 1 | 35 | 35   | bob  | jim  |

我正在寻找一种区分这两个表的方法。最好为列名加上前缀,例如。

TableA_ID | TableB_ID | TableA_B_ID | TableA_NAME | TableB_NAME |
        1 |        35 |          35 |         bob |         jim |

我知道“AS”关键字,但问题是我事先不知道列名是什么。 (我不知道 TableA 或 TableB 是否会有列名称)

所以我的问题是

当两个表可能具有相同的列名时,如何使用 INNER JOIN 区分两个表之间的列?

我正在使用 SQLite3。

【问题讨论】:

    标签: sql sqlite


    【解决方案1】:

    您的结果集(根据您的查询)应该包含所有 TableA 列,后跟所有 TableB 列,因此当您到达第二个 ID 列时,您就知道您进入了 TableB 数据。

    也就是说,对我来说,您从两个表中查询所有数据而您在功能上一无所知...

    【讨论】:

    • 听起来像是某种时髦的动态 SQL,它可能会查询用户在运行时生成的表。
    • 同意,如果您不知道列名,则说明您的设计存在重大问题。 select 语句不应该使用 select *,列名应该指定,特别是在 join 中,同一列返回两次,这很浪费服务器资源。
    • 如果正在创建表,它们的列名可以被捕获,但是......
    • 我不想在我的问题中涉及系统的复杂性,因为它有点令人困惑。我有一个从 TableA 获取一行的基类,它对表设计知之甚少,只知道它对 TableB 有一个 FK。基类使用它知道的列对结果进行一些简单的工作(验证、排序),然后将其交给知道如何处理正在完成更多工作的其他一些列的子类。我想将其保留在一个查询中,因为我正在为其构建此系统的设备的文件 IO 非常慢。 (10k 数据的秒数)
    • 一个大查询基准优于测试中的 5 个小查询。
    【解决方案2】:

    这无疑是一个 hack 解决方案,但是:

    SELECT TableA.*, "#", TableB.* 
    FROM TableA INNER JOIN TableB ON TableA.B_ID= TableB.id;
    

    将生成一个结果列表,该列表将分为两个块,即 # 列的左侧和右侧。

    【讨论】:

      猜你喜欢
      • 2021-11-25
      • 2021-07-08
      • 2016-03-24
      • 2013-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多