从n表到n表返回n列

时间:2018-10-23 16:09:38

标签: sql sql-server

具有此配置,明智的关系模型:

A --- * C * --- B

Cab之间的n对n表。

鉴于C具有以下字段:aID, bID, cValue

并且B具有以下内容:bID, bName

如何为A适用的所有n选择B中带有aID列的所有条目?

例如,选择将返回以下列

aID - bName1 - bName2 - bName3
1   - cValue1 - cvalue2 - cvalue3
2   - cValue4 - cvalue5 - cvalue6

由于A中的不同条目可能与B中的所有条目匹配,也可能不匹配,因此某些列可能为空。

1 个答案:

答案 0 :(得分:5)

单查询是不可能的。

SQL语言有一个非常严格的要求,要在查询编译时知道列的数量和类型。不能通过数据来查询列的数量或类型,例如对此问题进行查询。甚至SELECT *查询仍然可以从表架构中获取固定的列信息。

相反,您必须分三个步骤进行操作:

  1. 编写查询以返回有关所需列的数据
  2. 使用该查询的结果动态生成新查询
  3. 执行动态SQL并返回结果

即使那样,通常也可以考虑在客户端系统中进行数据透视。

可能还有另一种可能性。如果您可以事先对A <=> B连接的数量进行合理的限制,则可以多次(通过C)在A和B之间进行一次LEFT JOIN,对于每个可能的连接都进行一次,最终可能会得到一个结果中有很多NULL值。这也可能是非常浪费的查询。