如何使用匹配的外键值返回唯一对象?
问题描述:
我有一个拆分选择语句,我在第一个目标SELECT
中返回给定电子邮件的所有唯一仪表板。如何使用匹配的外键值返回唯一对象?
然后第二个SELECT
返回与唯一仪表板的ID相匹配的关联图表和KPI外键。
所以我做的尝试是使用两个选择之间的UNION
,这给出了一个错误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但在选择之间添加偶数列值的解决方案不适合这种情况。
问:
你怎么可以返回唯一对象匹配的外键值?
这是我想出了目前的程序,但我接受更好的替代品:
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
而且这是四个表的要点,外键约束已经为简洁,删除:
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"
},
答
你的联盟将无法正常工作。尝试这个。
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]
答
这个帮助;我已经习惯了与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;