【问题标题】:SQL select from table and get table nameSQL 从表中选择并获取表名
【发布时间】:2014-04-03 06:05:03
【问题描述】:

我喜欢三个表,它们有一些相同的列,如 ID、名称、图像、... 我正在使用此代码从中选择

(SELECT ID, Name FROM `creatures` WHERE ... )
UNION
(SELECT ID, Name FROM `items` ...)
UNION
( ... FROM `anothertable` ... )

我在 php 中执行此操作,它为每个结果在表中创建一行。现在的问题是,我需要知道该行是从哪个表中获取的。我是 SQL 新手,我不知道它是否可以以某种方式完成。我想像这样的事情:

SELECT ID, Name, TableName FROM ...

有可能吗?

【问题讨论】:

  • 正如一些答案指出的那样,UNION ALL 集合运算符比UNION 集合运算符更有效,因为它不会产生对结果集进行排序以识别和删除的开销在返回之前重复行。
  • 好的,我肯定会使用它 :) 谢谢大家的回答 :)

标签: php mysql sql sql-server


【解决方案1】:

您可以在选择中添加一个指示表名的列;

(SELECT 'creatures' AS tablename, ID, Name FROM `creatures` WHERE ... )
UNION
(SELECT 'items' AS tablename, ID, Name FROM `items` ...)
UNION
( ... FROM `anothertable` ... )

附带说明,因为您想要 所有 行,使用 UNION ALL 更快,因为它不需要执行 DISTINCT 来消除重复。

【讨论】:

    【解决方案2】:

    您可以将表名作为字符串文字添加到每个查询中:

    (SELECT 'creatures' AS table_name, ID, Name FROM `creatures` WHERE ... )
    UNION
    (SELECT 'items' AS table_name, ID, Name FROM `items` ...)
    UNION
    ( ... FROM `anothertable` ... )
    

    编辑: 请注意,由于您知道来自不同表的两行不能相等,因此您现在可以使用 union all 而不是 union,这可能会给您带来轻微的性能提升。

    【讨论】:

      【解决方案3】:

      试试这个:

      (SELECT ID, Name, 'creatures' as TableName FROM `creatures` WHERE ... )
      UNION ALL
      (SELECT ID, Name, 'items' as TableName FROM `items` ...)
      UNION All
      ( SELECT ID, Name, 'anothertable' as TableName FROM `anothertable` ... )
      

      示例结果:

      ID   Name    TableName
      1    Name1   creatures
      2    Name2   creatures
      1    Name3   items
      1    Name5   anothertable
      

      【讨论】:

        【解决方案4】:

        您可以简单地在 sql 中进行硬编码,如下所示

        (SELECT ID, Name,'creatures' as TableName FROM `creatures` WHERE ... )
        UNION
        (SELECT ID, Name,'items' as TableName FROM `items` ...)
        UNION
        ( ... FROM `anothertable` ... )
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-24
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多