Union

從單個表但從不同路徑獲取表數據

  • August 2, 2016

向 StackExchange 的所有專家致以問候。

我遇到的問題似乎很簡單,只是我對 SQL 的了解不足,無法做到這一點。

我有一個名為“ApplicationPlans”的表,其中包含有關我的每個應用程序中的計劃的數據。此表以 ApplicationId 作為外鍵連接到“應用程序”表。“應用程序”直接連接到“使用者角色”表一次,並通過“客戶”表連接一次。允許我們在應用程序級別和/或客戶端訪問級別上設置訪問級別。

圖可以看到這裡

我的目標是根據使用者的角色從“ApplicationPlans”表中獲取數據。由於此數據將在網格中,因此最好不要使用兩個選擇查詢的 UNION,例如 image這裡

當然這是我的想法,你可能會說它具有相同的性能,我會這樣做。

這就是我的情況,感謝任何建議

  • 為了清楚起見,我必須添加,我需要我的使用者可以訪問的“應用程序計劃”中的那些數據。這是通過首先找到該使用者的角色,然後分兩個階段來確定的:

    1. 找到該使用者有權訪問的客戶端,然後找到他們的應用程序,然後找到他們的 ApplicationPlan。
    2. 查找此使用者可以直接訪問的應用程序,然後查找他們擁有的 ApplicationPlans。

結果旨在將這兩個集合結合在一起。

不確定我是否理解問題所在,但您可以使用如下派生表:

select ur.id, c.scopeid
from userroles ur
left join clients c
   on ur.scopeid = c.id

然後將其與其餘表連接起來。就像是:

select ...
from (
   select ur.id, c.id as clientid, ...
   from userroles ur
   left join clients c
       on ur.scopeid = c.id
) dt
join applications a
   on dt.id = a.id
   or dt.clientid = a.clientid
join applicationplans ap
   on ap.applicationid = a.id

一般來說,DDL(創建表……等)比用於描述表的圖像更受歡迎。

好的,到目前為止,通過搜尋,我找到了一個答案,那就是一個表上的多個聯接,到目前為止,我編寫了這個查詢,這對我有用。

我想請版主編輯這個問題,以便為所有尋找此類簡單問題的 sql 初學者提供更好的指南!

我藉此機會感謝所有自願提供幫助的人。

SELECT    
DISTINCT
  [ApplicationPlans].[Id]
 ,[ApplicationPlans].[Code]
 ,[ApplicationPlans].[Name]
 ,[ApplicationPlans].[UnsubscribeCode]
 ,[ApplicationPlans].[ThumbnailUrl]
 ,[ApplicationPlans].[ApplicationId]
 ,[ApplicationPlans].[Type]
 ,[ApplicationPlans].[IsActive]
 ,[ApplicationPlans].[ActiveUntil]
 ,[ApplicationPlans].[Description]
 ,[ApplicationPlans].[Price]
 ,[ApplicationPlans].[HasSubscription]
 ,[ApplicationPlans].[ExpireDays]
 ,[ApplicationPlans].[HasDebt]
 ,[ApplicationPlans].[DebtTarget]
 ,[ApplicationPlans].[DebtDays]
 ,[ApplicationPlans].[DebtStepDays]
 ,[ApplicationPlans].[DebtSleepDays]
 ,[ApplicationPlans].[DebtFinePrice]
 ,[ApplicationPlans].[CreditAmount]
FROM                    
Clients INNER JOIN
Applications ON Clients.Id = Applications.ClientId INNER JOIN
                    ApplicationPlans ON Applications.Id = ApplicationPlans.ApplicationId INNER JOIN

UserRoles ON Clients.Id = UserRoles.ScopeId 或 Applications.Id = UserRoles.ScopeId

                    INNER JOIN (SELECT 3 as ScopeTypeId) AS ScopeSystem ON UserRoles.ScopeTypeId = ScopeSystem.ScopeTypeID
WHERE  UserRoles.UserId = @UserId

引用自:https://dba.stackexchange.com/questions/145505