【问题标题】:How can we get the value of a column to use as a table name for an inner join?我们如何获取列的值以用作内部连接的表名?
【发布时间】:2011-06-26 04:52:30
【问题描述】:

我们如何引用一个表中的列值作为连接的引用(参见下面的示例)?

SELECT t1.*, t2.*, t3.* FROM term_relationships as t1 
INNER JOIN modules as t2 ON t2.module_id = t1.object_id
INNER JOIN t2.nextOfKinTable as t3 ON t3.module_id = t2.module_id;

我考虑过使用 information_schema,但要完成一些可能更容易的事情,只需维护对要连接到当前连接结果的表的引用,只是我不知道如何制作它们。以这种方式加入。请帮忙:(

编辑:

  1. 本质上,我们想要连接 table1、table2 和 table3,只是 table3 的名称是存储在 table2 中的值。
  2. 本例常用的列是module_id(object_id)
  3. 未知表是t2.nextOfKinTable

【问题讨论】:

  • 嗨,我不完全明白你想要完成什么。据我所知,您只能加入另一个表或表变量。从您的查询中,我看不到为哪个表分配了“t3”别名,并且您的第二个连接似乎引用了不同字段上的同一个表。您可以在第一次加入时使用“AND”语句检查两个字段。

标签: mysql sql inner-join


【解决方案1】:

试试这个

 declare @tabName varchar(1000)
 set @tabName = (select top 1 ProductName as tabName from products)

 declare @query varchar(8000)
 set @query = ' select
 p.ProductName as '''+@tabName+''' 
 from Products p'

---print(@query)
 exec (@query)

【讨论】:

  • 哦,现在我得到了这个问题。这实际上是一个很好的解决方案,只需在查询中添加一个连接并连接表名的变量即可。
  • 你是说如果我使用 concat 我将被允许在查询中使用它的结果作为表名?
  • 哦,我明白你在说什么。让我试试看。
【解决方案2】:

在 SQL 中没有执行此操作的标准方法。考虑一下您的 t2 表是否包含 1000 行,并且每一行都有一个不同的 nextOfKinTable 值。这将导致查询爆炸成 1002 表连接。不漂亮。我什至不知道有任何专有语法可以在我知道的任何产品中支持它。

如果不同列值的数量很少,您可以使用 LEFT JOIN,但每个连接的表都会收到不同的别名(例如使用 3 个表):

SELECT
   t1.*, --TODO: List columns
   t2.*, --TODO: List columns
   COALESCE(t3.ColumnA,t4.ColumnA,t5.ColumnA) as ColumnA,
   COALESCE(t3.ColumnB,t4.ColumnB,t5.ColumnB) as ColumnB
FROM
    term_relationships as t1 
        INNER JOIN
    modules as t2
        ON
           t2.module_id = t1.object_id
        LEFT JOIN
    Table3 as t3
        ON
           t3.module_id = t2.module_id AND
           t2.nextOfKinTable = 'Table3'
        LEFT JOIN
    Table4 as t4
        ON
           t4.module_id = t2.module_id AND
           t2.nextOfKinTable = 'Table4'
        LEFT JOIN
    Table5 as t5
        ON
           t5.module_id = t2.module_id AND
           t2.nextOfKinTable = 'Table5'

您可能还想考虑这些单独的表是否实际上应该是一个表,并带有额外的列来区分行。这个问题有时被称为属性分裂。 (参见 Joe Celko 在article from 2009 中的表格拆分示例)

【讨论】:

  • 很好的答案和参考文章。我现在正在查看 Joe Celko 的文章。
  • 谢谢,我会及时通知你们我对此事的调查结果。
  • 在旁注中,我尝试设置的原因是用户希望拥有尽可能多的不同模块类型(普通 html 模块、菜单模块、横幅模块等)和因为它们都共享公共模块字段,我认为将公共字段(大约 20 个)放在一个单独的表中它们都引用是有意义的。没有?
  • 我也明白你所说的,关于有 1000 个结果,但对于模块,这些永远不会超过 100。对清晰的 sql 表示敬意!疯狂的漂亮!再次感谢:)
猜你喜欢
  • 2019-07-29
  • 2020-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-17
  • 1970-01-01
相关资源
最近更新 更多