我有一个包含多个表的数据库,即table1,table2,table3,具有相同的字段。不知怎的,我无法将这些表合并为一个。
有没有办法一个接一个地查询它们以获得相同的条件,这样如果在第一个表中找到记录,则返回找到的记录,否则在第二个表中搜索,依此类推。 像:
Select * from table1 where cloumnX = 'xyz'
if found return the rocord
else
Select * from table2 where cloumnX = 'xyz'
...
Select * from lastTable where cloumnX = 'xyz'
答案 0 :(得分:1)
我不确定你想要的输出是什么,但你可以去下面:
if exists (Select 1 from table1 where cloumnX = 'xyz')
Select * from table1 where cloumnX = 'xyz'
else if exists (Select 1 from table2 where cloumnX = 'xyz')
Select * from table1 where cloumnX = 'xyz'
else if exists (Select 1 from table3 where cloumnX = 'xyz')
Select * from table3 where cloumnX = 'xyz'
else
print 'no records returned from tables'
或如评论中所述,使用UNION
,但您需要记住:
“使用UNION,INTERSECT或EXCEPT运算符组合的所有查询都必须 在目标列表中有相同数量的表达式“
Select * from table1 where cloumnX = 'xyz'
union
Select * from table2 where cloumnX = 'xyz'
union
Select * from table3 where cloumnX = 'xyz'
答案 1 :(得分:1)
假设您提出的问题实际上是您需要做的事情,那么应该这样做:
SET NOCOUNT ON
SELECT *
INTO #table
FROM table1
WHERE cloumnX = 'xyz'
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO #table
SELECT *
FROM table2
WHERE cloumnX = 'xyz'
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO #table
SELECT *
FROM table3
WHERE cloumnX = 'xyz'
END
END
SELECT *
FROM #table
也就是说,您可以使用其他技术更好地完成此操作。例如,上面提到的UNION可以工作,但如果给定键值的不同行可以在多个表中,则需要在ORDER BY中包含一个字段,并在SELECT语句中使用TOP 1来做什么你问。
答案 2 :(得分:1)
穆罕默德,
我将同意这里的许多其他人,这看起来似乎在架构设计方面有改进的余地;但是,我确实想以一种相当简单的方式对所提出的问题提出建议。
您可以在此处获取union all查询(union将消除空值),并为其添加“rank”并选择顶部1.请参阅下面的示例。
select top 1 cloumnX from (
select 1 as ranked, * from table1 where cloumnX = 'xyz' union all
select 2 as ranked, * from table2 where cloumnX = 'xyz' union all
select 3 as ranked, * from table3 where cloumnX = 'xyz'
)a
order by ranked
同样,虽然这可能会在短期内解决您的问题,但如果您遇到这种情况,则需要重新考虑您的架构。