2011-05-15 120 views
3

我有五个表“ArtBook,Eng,comm,Law,mgt”,每个表都有相同的列,我想搜索所有的信息,特定书的编号为 eg-存储过程的sql查询

select * from ArtBook,Eng,Comm,Law,mgt where @BookId=ArtBooks.BookId 
or @BookId=CommBooks.BookId 
or @BookId=Eng.BookId 
or @BookId=Law.BookId 
or @BookId=mgt.BookId 
+3

你需要一个'UNION ALL'而不是'JOIN',但它看起来不像我正确的结构。如果您希望允许跨多个流派的书籍,那么为什么不用一张表格来显示流派的专栏或单独的结合表格? – 2011-05-15 16:22:14

回答

0

可以使用UNION或UNION ALL运算符。

(SELECT * FROM ArtBook) 
UNION ALL 
(SELECT * FROM Eng) 
... 
WHERE @BookId=ArtBooks.BookId or 
     @BookId=CommBooks.BookId or 
     @BookId=Eng.BookId or 
     @BookId=Law.BookId or 
     @BookId=mgt.BookId 

等等等等。尽管您可能会考虑重新构建数据的存储方式,以使这种事情更容易。

+0

'WHERE'子句只需要在'UNION ALL'的每个部分中有一个条件而不是5。 – 2011-05-15 16:25:51

+0

是的,那样会更好,改变答案以反映这一点。 – zellio 2011-05-15 16:27:16

3

如果所有表格都存储不同类别的书籍,则将它们合并成一张表格并添加一个“类别”列。由于您已经演示的原因,将这些分类到不同的表格中并不是一个好主意。

1
select * 
from ArtBook 
where BookId = @BookId 
union all 
select * 
from Eng 
where BookId = @BookId 
union all 
select * 
from Comm 
where BookId = @BookId 
union all 
select * 
from Law 
where BookId = @BookId 
union all 
select * 
from Mgt 
where BookId = @BookId 
+0

@Archi - 你找到答案了吗? – 2011-05-18 17:42:44