2015-11-25 77 views
0

我正在創建一個搜索功能,它需要一個關鍵字並在我的數據庫的3個表中的每個指定列中查找。在sql server中優化搜索請求

表1是Utilisateurs

表2是ReserveLocaux

表3中稱爲Utilisateurs_ReserveLocaux並且它是連接用戶和預訂與他們的主鍵的表。

這裏是我想出了迄今爲止

ALTER PROCEDURE Search_ReservLocaux 
-- Add the parameters for the stored procedure here 
@keyword as varchar(100), 
@noUsager as int 
AS 

declare @searchTerm as varchar(105) = cast('%' + @keyword + '%' as  varchar(105)) 

--Select all reservations information where allowed field include search term 
--where the user making the request participates in 
--where additional user are part of the same reservation 
select distinct a.NoReservation,a.ApprobationProf,a.Commentaire,a.Date,a.HeureDébut,a.HeureFin,a  .NoLocal,a.NoReservation,a.PersonnesExt from ReserveLocaux a 
join Utilisateurs_ReserveLocaux b on a.NoReservation = b.NoReservation 
join Utilisateurs c on c.id= b.NoUsager 
where(
    a.[Date] like @searchTerm or 
    a.[HeureDébut] like @searchTerm or 
    a.[HeureFin] like @searchTerm or 
    a.[Commentaire] like @searchTerm or 
    a.[CommentaireGardien] like @searchTerm or 
    a.[ApprobationProf] like @searchTerm or 
    a.[NoLocal] like @searchTerm or 
    a.[Actif] like @searchTerm or 
    a.[PersonnesExt] like @searchTerm or 
    b.[NoUsager] like @searchTerm or 
    b.[NoReservation] like @searchTerm or 
    c.[NomUsager] like @searchTerm or 
    c.[PrenomUsager] like @searchTerm 
) 
    and(a.Actif is null or a.Actif = 1) 

    and b.NoUsager = @noUsager 
Return 
GO 

exec Search_ReservLocaux 'saoindoaisn',3 
go 

基本上,這個搜索我得到我最需要的信息的。問題是,我還需要查找具有在Utilisateurs_ReserveLocaux表肚裏發現了同樣的預約號碼每個用戶的是:

|Id_User|Id_Reservation| 
    3   45 
    4   45 
    5   32 

我需要訪問用戶#3(一個是誰做搜索)和被稱爲「saoindoaisn」的用戶#4。

我知道問題出在最後一行的where語句

b.NoUsager = @noUsager 

,但如果我刪除它,我失去了我的數據的安全性,因爲用戶做搜索可以訪問的一切,他是不是參與,如果我保留它,我無法訪問所需的數據。

有人可以幫我找到這條線的替代品嗎? PS:如果不是100%清楚,對不起。

回答

2

您是否正在尋找?

b.Id_Reservation in (select id_reservation 
        from Utilisateurs_ReserveLocaux url2 
        where url2.NoUsager = @noUsager 
        ) 

這是一個有點很難說,如果你的整個查詢邏輯可以簡化,但我認爲這是你想要什麼外where條款。

+0

它不起作用。錯誤:**子查詢返回多個值。當子查詢遵循=,!=,<, <= , >,> =或者當子查詢用作表達式時,這是不允許的。**查詢返回@noUsager所做的每個保留。 – ThallForms

+0

@ThallForms。 。 。您的示例數據在每個用戶的表中只有一行。更通用的方法是使用'in'而不是'='。 –

+0

我修改你的查詢,所以而不是b.Id_reservation =(代碼),我用b.Id_reservation IN(代碼),它的工作原理。非常感謝你! – ThallForms