2016-11-10 8 views
0

私は最初にSELECTを指定して、特定の電子メールのすべてのユニークなダッシュボードを返すことを目指しています。一致する外部キー値を持つ一意のオブジェクトを返す方法はありますか?

次に、固有のダッシュボードのIDと一致する関連するチャートとKPI外部キーを返すためにSELECTを返します。

だから私が試したのは、UNIONを2つの選択の間に使用して、エラーAll queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target listsを与えていることです。

ここではcome across a similar issueでしたが、selectの間に偶数の列値を追加する方法は、この状況には適していません。

質問:

あなたが外部キー値に一致するとユニークなオブジェクトを返すことができますどのように?

これは私が思い付いた現在の手順があるが、私はより良い選択肢に開いている:

ALTER PROCEDURE [dbo].[GetUserProfile] 
    @p_email VARCHAR(100) 
AS 

    BEGIN  

      SELECT UserName, Email, Dashboard_Name, RID from [dbo].[User] 
       inner join [dbo].[Dashboard] on 
       [Dashboard].[USER_ID]=[User].Email 
       and [email protected]_email  
      UNION 
       SELECT KPI_Name, Chart_Name FROM [KPI] 
      inner join [dbo].[Chart] on 
       [Chart].[KPI_ID]=[KPI].ID 

    END 

また、これは4つのテーブルの要旨は、外部キー制約を簡潔にするため削除されました。

TABLE [dbo].[User](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[UserName] [varchar](50) NOT NULL, 
[Email] [varchar](80) NOT NULL,   


TABLE [dbo].[Dashboard](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[Dashboard_Name] [varchar](100) NOT NULL, 
[RID] [nvarchar](255) NOT NULL, 
[USER_ID] [varchar](80) NOT NULL 


TABLE [dbo].[KPI](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[KPI_Name] [varchar](100) NOT NULL, 
[DashboardID] [int] NOT NULL, 


TABLE [dbo].[Chart](
[ID] [int] IDENTITY(1,1) NOT NULL, 
[Chart_Name] [varchar](100) NOT NULL, 
[KPI_ID] [int] NOT NULL, 

クエリが正しいのであれば、これは予想される結果になります:

{ 
    UserName:"brian", 
    Email:"[email protected]", 
    Dashboard_Name:"test dash 1", 
    RID:"2003", 
    DashboardID:1, 
    KPI_Name:"test kpi 1", 
    KPI_ID:1, 
    Chart_ID:1, 
    Chart_Name:"ch1, ch2, ch3" 
}, 
{ 
    UserName:"brian", 
    Email:"[email protected]", 
    Dashboard_Name:"test dash 2", 
    RID:"2003", 
    DashboardID:2, 
    KPI_Name:"test kpi 2", 
    KPI_ID:2, 
    Chart_ID:2, 
    Chart_Name:"ch4, ch5, ch6" 
}, 

答えて

1

あなたの連合は上記のように動作しません。これを試して。

SELECT UserName, Email, Dashboard_Name, RID, Dashboard.ID as Dashboard_ID, KPI_Name, KPI.ID as KPI_ID,Chart.ID as Chart_ID, Chart_Name 
    from [User] 
    inner join [Dashboard] on [Dashboard].[USER_ID]=[User].Email 
       and [User][email protected]_email 
    Inner Join [KPI] ON [Dashboard].[Dashboard_ID] = [KPI].[Dashboard_ID] 
    Inner Join [Chart] ON [KPI].[ID] = [Chart].[KPI_ID] 
0

この声援。私はOracle構文に慣れていますので、多かれ少なかれブランチが必要かどうかわかりません:

ALTER PROCEDURE [dbo].[GetUserProfile] 
    @p_email VARCHAR(100) 
AS 
BEGIN 
DECLARE 
    vUserName [varchar](50); 
    vEmail [varchar](80); 
    vDashboard_Name [varchar](100); 
    vRID [nvarchar](255); 
    vDashboardId [int]; 
    vKPI_Name [varchar](100); 
    vChart_Name [varchar](100); 
BEGIN 
    SELECT U.UserName, U.Email, D.Dashboard_Name, 
     D.RID, D.ID 
    INTO vUserName, vEmail, vDashboard_Name, 
     vRID, vDashboardId 
    FROM [dbo].[User] U INNER JOIN [dbo].[Dashboard] D ON D.[USER_ID]=U.Email 
    WHERE [email protected]_email;  

    SELECT K.KPI_Name, C.Chart_Name 
    INTO vKPI_Name, vChart_Name 
    FROM [KPI] K INNER JOIN [dbo].[Chart] C ON C.[KPI_ID]=K.ID 
    WHERE K.DashboardID = vDashboardId; 
END; 
END; 
関連する問題