以下是我的情况:
表1包含一组使用唯一标识符的id的数据。该表与其他约6个表有一对多关系。
给出Id为001的表1: 表2可能有3行外键:001 表3可能有12行外键:001 表4可能有0行,外键为:001 表5可能有28行外键:001
我需要编写一份报告,列出表1中指定时间范围内的所有行,然后是引用它的少数几个表中包含的所有数据。
我目前的伪代码方法如下:
select * from table 1
foreach(result) {
print result;
select * from table 2 where id = result.id;
foreach(result2) {
print result2;
}
select * from table 3 where id = result.id
foreach(result3) {
print result3;
}
//continued for each table
}
这意味着单个报告可以在1000个查询的邻居中运行。我知道这是过分的但是我的sql-fu有点弱,我可以使用一些帮助。
答案 0 :(得分:3)
表1中的LEFT OUTER JOIN Tables2-N
SELECT Table1.*, Table2.*, Table3.*, Table4.*, Table5.*
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.ID = Table2.ID
LEFT OUTER JOIN Table3 ON Table1.ID = Table3.ID
LEFT OUTER JOIN Table4 ON Table1.ID = Table4.ID
LEFT OUTER JOIN Table5 ON Table1.ID = Table5.ID
WHERE (CRITERIA)
答案 1 :(得分:2)
加入并不适合我。我讨厌在客户端解析数据。所有这些来自左连接的空值。
这是一个不使用联接的基于集合的解决方案。
INSERT INTO @LocalCollection (theKey)
SELECT id
FROM Table1
WHERE ...
SELECT * FROM Table1 WHERE id in (SELECT theKey FROM @LocalCollection)
SELECT * FROM Table2 WHERE id in (SELECT theKey FROM @LocalCollection)
SELECT * FROM Table3 WHERE id in (SELECT theKey FROM @LocalCollection)
SELECT * FROM Table4 WHERE id in (SELECT theKey FROM @LocalCollection)
SELECT * FROM Table5 WHERE id in (SELECT theKey FROM @LocalCollection)
答案 2 :(得分:1)
啊!程序!如果您需要在第一个表的结果之后从其他表中排序结果,那么我的SQL看起来就像这样。
Insert Into #rows Select id from Table1 where date between '12/30' and '12/31' Select * from Table1 t join #rows r on t.id = r.id Select * from Table2 t join #rows r on t.id = r.id --etc
如果您想按初始ID对结果进行分组,请使用左外连接,如前所述。
答案 3 :(得分:1)
如果您感觉大胆,最好使用像Crystal或Jasper这样的报告工具,甚至是XSL-FO。他们有内置的东西来专门处理这个问题。这不是原始SQL中可行的方法。
如果所有行的格式(标题以及所有细节)都相同,那么将它作为存储过程也很容易。
我会做什么:将它作为连接进行,因此您将在每一行都有标题数据,然后使用报告工具进行分组。
答案 4 :(得分:1)
SELECT * FROM table1 t1
INNER JOIN table2 t2 ON t1.id = t2.resultid -- this could be a left join if the table is not guaranteed to have entries for t1.id
INNER JOIN table2 t3 ON t1.id = t3.resultid -- etc
或者如果数据全部采用相同的格式。
SELECT cola,colb FROM table1 WHERE id = @id
UNION ALL
SELECT cola,colb FROM table2 WHERE resultid = @id
UNION ALL
SELECT cola,colb FROM table3 WHERE resultid = @id
这实际上取决于您需要数据输出到报告的格式。
如果您可以提供您想要输出的样本,我可能会提供更多帮助。
答案 5 :(得分:0)
将所有表格加在一起。
select * from table_1 left join table_2 using(id) left join table_3 using(id);
然后,您需要在代码中汇总列以根据需要格式化报告。
答案 6 :(得分:0)
我要做的是打开以下查询的游标:
SELECT * from table1 order by id
SELECT * from table1 r, table2 t where t.table1_id = r.id order by r.id
SELECT * from table1 r, table3 t where t.table1_id = r.id order by r.id
然后我会并行浏览这些游标,打印结果。您可以这样做,因为所有都以相同的顺序出现。 (请注意,我建议虽然table1的主ID可能被命名为id,但不会在其他表中具有该名称。)
答案 7 :(得分:0)
所有表格都具有相同的格式吗?如果没有,那么如果您必须有一个可以显示n
不同类型行的报告。如果您只对相同的列感兴趣,那么它就更容易了。
大多数数据库都有某种形式的动态SQL。在这种情况下,您可以执行以下操作:
create temporary table from
select * from table1 where rows within time frame
x integer
sql varchar(something)
x = 1
while x <= numresults {
sql = 'SELECT * from table' + CAST(X as varchar) + ' where id in (select id from temporary table'
execute sql
x = x + 1
}
但我的意思是基本上你在主表上运行一个查询以获取所需的行,然后为每个子表运行一个查询以获得与主表匹配的行。
如果报告要求每个表使用相同的2或3列,您可以将select * from tablex
更改为insert into
并在结尾处获得单个结果集...