【问题标题】:How to choose proper table name dynamically from multiple tables for creating join query如何从多个表中动态选择合适的表名来创建连接查询
【发布时间】:2014-03-10 05:07:48
【问题描述】:

我想动态创建 join 查询,其中包含以下表格:

表1)userTable:包含userId、userFirstName、userLastName

表2)groupTable:包含groupId、groupName、groupDescription

表 3) userGroup : 包含 userTable 和 groupTable 之间的关系

表 4) groupRoles:包含 groupId 和 roleId 之间的关系(任意随机列)

案例 1:

如果我想知道 groupId 在哪些表中存在/常见,它会给出这样的结果

查询:

我有 1 个仅接受 userId 的表单。通过使用 userId,我们必须找到:userId、userFirstName、userLastName 和 groupName。

问题:

问题是在为join 子句创建动态查询时。

与案例 1 一样,表有 2 个选项:groupRoles 或 userGroup。

那么我将如何知道从这两个选项中动态选择哪个表,以便通过关系表(在我的情况下是 userGroup 表)将我带到 groupTable? 就我而言,我必须找到 userId、userFirstName、userLastName 和 groupName。

我可以从 userTable 中获取 userId、userFirstName 和 userLastName。但是要获取 groupTable 中存在的 groupName 列,我们必须获取 userGroup 表的关系以获取 join 查询。

那么我们如何动态地知道要从 tableNames 中选择哪个表(如 case1),以便我们可以从查询中获取 GroupName 列?

【问题讨论】:

  • 您希望将以下字段显示为:Userid、Userfirstname、Userlastname 和 groupname

标签: sql sql-server relational-database


【解决方案1】:

我想也许我已经理解了您的问题,您是否希望以下输出为:

SELECT 
a.userid,
a.userfirstname,
a.userlastname,
b.groupname
FROM Usertable AS a
INNER JOIN  grouptable AS b
ON a.userid=b.groupid

用户表:

1| a| b 
2| c| d

分组表:

1 |X |io
2 |Y |oi

输出:

1| a| b|X 
2| c| d|Y

更新:

try this one to click

随着表单和数据元素数量的增加,通用数据库设计限制了新表的扩散。另一方面,在我们的例子中,即使是最简单的查询也涉及 3 个表。

查询确实令人难以置信。 3 年后,我开始认为显式表更好。我宁愿处理更多能够更好地反映业务形式/模型的表格——我只需查看它们就可以理解;副 1/2 的表,但有大量无意义的连接表,需要惊人的长嵌套查询才能从数据中获得最基本的意义。您实际上开始记住各个身份列主键的含义/上下文!

最后,我们已经发展到拥有一张表来统治所有这些,从而摆脱现有设计和不断变化的用户需求中的一些固有复杂性(以及过去糟糕的编码和设计决策)。尽管如此,我们确信当表大小达到百万以上行大小时我们会遇到问题。

【讨论】:

  • 非常感谢您的回复。但是我必须从任一表中动态选择 tableName,即 case1 中的 GROUPROLES 或 USERGROUP。我将如何动态地知道根据所需查询选择哪个表。
  • 因为两个表都包含公共列,即 Groupid,因此我应该从该关系表中获取 Groupname 列。
  • 我明白你想说什么,但由于我的连接查询是高度动态的,我必须使用这个连接查询来创建用户表单,用户可以在其中询问任何细节,那就是我想创建查询,以便它可以根据需要创建查询并显示结果。例如,在我们的案例中,假设用户请求“GroupDescription”而不是“groupname”,那么它也应该给我们正确的查询结果。跨度>
猜你喜欢
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
  • 2021-06-03
  • 2014-08-09
  • 1970-01-01
相关资源
最近更新 更多