我正在尝试构建一个允许用户自定义报告的报告系统,每个用户都可以在数据网格上创建自定义报告。
ID GRIDID USER_ID REPORTNAME REPORTPAYLOAD CREATED
--- -------------------- ------- ----------- ------------- ------------------
4 CompleteReportView1 User1 Completed (CLOB) 4/18/2011 8:40:05
6 CompleteReportView1 User1 All (CLOB) 4/18/2011 8:40:48
10 CompleteReportView1 Completed (CLOB) 4/18/2011 8:40:05
12 CompleteReportView1 All (CLOB) 4/18/2011 8:40:48
16 CompleteReportView1 Default (CLOB) 4/18/2011 9:53:38
18 CompleteReportView1 User2 Completed (CLOB) 4/18/2011 8:40:05
20 CompleteReportView1 User2 All (CLOB) 4/18/2011 8:40:48
33 CompleteReportView1 User3 Default (CLOB) 4/18/2011 9:53:38
我希望特定用户的报告列表包含他们设置的所有报告,以及User_Id的null报告。如果用户的名称报告与user_id = null报告相同,则只返回他们的报告。
以下是我想要返回的数据集: User_Id = User1
ID GRIDID USER_ID REPORTNAME REPORTPAYLOAD CREATED
--- -------------------- ------- ----------- ------------- ------------------
4 CompleteReportView1 User1 Completed (CLOB) 4/18/2011 8:40:05
6 CompleteReportView1 User1 All (CLOB) 4/18/2011 8:40:48
16 CompleteReportView1 Default (CLOB) 4/18/2011 9:53:38
User_Id = User2
ID GRIDID USER_ID REPORTNAME REPORTPAYLOAD CREATED
--- -------------------- ------- ----------- ------------- ------------------
16 CompleteReportView1 Default (CLOB) 4/18/2011 9:53:38
18 CompleteReportView1 User2 Completed (CLOB) 4/18/2011 8:40:05
20 CompleteReportView1 User2 All (CLOB) 4/18/2011 8:40:48
User_Id = User3
ID GRIDID USER_ID REPORTNAME REPORTPAYLOAD CREATED
--- -------------------- ------- ----------- ------------- ------------------
10 CompleteReportView1 Completed (CLOB) 4/18/2011 8:40:05
12 CompleteReportView1 All (CLOB) 4/18/2011 8:40:48
33 CompleteReportView1 User3 Default (CLOB) 4/18/2011 9:53:38
有人可以帮助我需要的SQL吗?如果最有意义的话,我愿意修改表结构。
答案 0 :(得分:2)
嗯,有几种方法可以做到这一点,在某种程度上,这取决于你想要的数据库无关。这样的东西应该适用于大多数dbs:
select *
from T
where USER_ID = :user
union
select *
from T
where USER_ID is null
and REPORTNAME not in (
select REPORTNAME
from T
where USER_ID = :user
)
假设T
是上表的名称,:user
是User1,User2等......
这是否是构建表的最佳方式是一个不同的问题。如果您真的只想要默认报告,您可能需要一种不同的方法。另请注意,如果表变大,这可能表现不佳。