重写查询以将多个 select 语句转换为一个 select
Rewrite the query to convert multiple select statements into one select
我有以下程序。它有 4 个 select 语句,其中一个是根据传入的参数 selected。每次我必须添加一个新列时,我必须确保将它添加到所有 select 语句。如果我错过了向 select 语句之一添加列,则应用程序会遇到错误。我正在尝试找到一种方法,只使用一个 select 语句,并根据传入的参数获得适当的结果。我不想使用动态 SQL 来实现它。还有其他方法吗?谢谢!
Create Procedure usp_region_order
@regionId varchar(100),
@custId varchar(100)
As
Begin
If @regionId = 'North'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionNorth rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'South'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionSouth rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'East'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionEast rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'West'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionWest rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
End /* procedure ends */
您可以形成所有区域的内联 table,然后使用单个一次性查询:
BEGIN
SELECT o.orderId, o.ordername, c.custName, c.custPhone
FROM dbo.customer c
INNER JOIN dbo.order o ON c.custId = o.custId
INNER JOIN dbo.region r ON o.regionId = r.regionId
INNER JOIN
(
SELECT regionId, 'North' AS region FROM dbo.regionNorth UNION ALL
SELECT regionId, 'South' FROM dbo.regionSouth UNION ALL
SELECT regionId, 'East' FROM dbo.regionEast UNION ALL
SELECT regionId, 'West' FROM dbo.regionWest
) rn
ON rn.regionId = r.regionId
WHERE
c.custId = @custId AND
r.regionId = @regionId AND
rn.region = @regionId
END
我有以下程序。它有 4 个 select 语句,其中一个是根据传入的参数 selected。每次我必须添加一个新列时,我必须确保将它添加到所有 select 语句。如果我错过了向 select 语句之一添加列,则应用程序会遇到错误。我正在尝试找到一种方法,只使用一个 select 语句,并根据传入的参数获得适当的结果。我不想使用动态 SQL 来实现它。还有其他方法吗?谢谢!
Create Procedure usp_region_order
@regionId varchar(100),
@custId varchar(100)
As
Begin
If @regionId = 'North'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionNorth rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'South'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionSouth rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'East'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionEast rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
Else If @regionId = 'West'
Begin
Select o.orderId, o.ordername, c.custName, c.custPhone
From dbo.customer c
Join dbo.order o
on c.custId = o.custId
Join dbo.region r
on o.regionId = r.regionId
Join dbo.regionWest rn
on r.regionId = rn.regionId
Where c.custId = @custId
And r.regionId = @regionId
End
End /* procedure ends */
您可以形成所有区域的内联 table,然后使用单个一次性查询:
BEGIN
SELECT o.orderId, o.ordername, c.custName, c.custPhone
FROM dbo.customer c
INNER JOIN dbo.order o ON c.custId = o.custId
INNER JOIN dbo.region r ON o.regionId = r.regionId
INNER JOIN
(
SELECT regionId, 'North' AS region FROM dbo.regionNorth UNION ALL
SELECT regionId, 'South' FROM dbo.regionSouth UNION ALL
SELECT regionId, 'East' FROM dbo.regionEast UNION ALL
SELECT regionId, 'West' FROM dbo.regionWest
) rn
ON rn.regionId = r.regionId
WHERE
c.custId = @custId AND
r.regionId = @regionId AND
rn.region = @regionId
END