最佳查询1:N关系

时间:2011-03-28 04:05:47

标签: sql

我有两张桌子,我给了USERNAME

User:
  USERID
  USERNAME
  ...other fields...

AccessRights (Many to One relationship with User.USERID):
  USERID
  GRANT

我想要User.*个字段,以及所有AccessRights AccessRights.USERID=User.USERID

我可以通过以下几种方式做到这一点:

  • 两个单独的查询,首先是User,获取USERID并将其用作第二个查询中的参数
  • 加入表格,但这会复制多行的所有User。*数据
  • 做一些时髦的存储过程来将结果编组到一个字段中

但我有这种直觉,我没有想到更好的方法,所以我想我会问。

2 个答案:

答案 0 :(得分:1)

根据数据库的不同,您还可以发送一个脚本,输出多个结果集。它还取决于您编写的语言。但是在Java中,如果使用Statement.execute(而不是executeQuery),则可以从查询中检索多个结果集。

这样,您可以先从User表中查询,然后将您要查找的用户填充到局部变量中,然后使用该变量查询AccessRights表。

除非你在谈论AccessRights中的大量行或用户中的大量列,否则进行连接非常简单,效率更高。只是尝试只获取用户所需的字段。通过线路移动的额外字节数据可能比数据库单独查询每个表的多次命中的开销更小(除非您使用上面的方法,这是一次点击,但在大多数情况下它可能有点过头,因为它有点复杂)。

答案 1 :(得分:0)

一种选择是使用函数获取user.*数据并将AccessRights行值作为逗号分隔的字符串。像:

| user1 | 1234 | right1,right2,right3 |

在T-SQL(MS SQL Server)中,您可以使用COALESCESTUFF函数,也可以内联操作而不是使用单独的函数。

但你需要注意表现。

相关问题