2014-04-25 1 views
0

SQL Server 2008에서 여러 테이블을 사용하여 작업했으며 데이터가 기본 ASP 응용 프로그램에서 사용되었습니다. 다음 쿼리 (아래 참조)를 사용하여 '업데이트'페이지에 확인란을 채 웁니다. 첫 번째 테이블 (KSA)은 체크 박스를 채우는 반면 두 번째 테이블 (KSA_Out)은 사용자가 선택한 체크 박스를 제공합니다. 각 Objective에 대해 이러한 KSA 체크 박스 세트가 있습니다. 문제는 조인 된 테이블에 일치하는 항목이 없더라도 KSA Left Join이 폼의 체크 박스를 채우고 싶습니다.왼쪽 외부 조인, 다중 테이블, 기본 ASP 응용 프로그램에서 확인란 채우기

응용 프로그램의 배경은 다음과 같습니다. 표가있는 페이지 : 각 목표에 대한 행과 각 결과에 대한 열이 있습니다. 표에는 각 셀에 "추가/편집"링크가있는 Objectives 테이블과 결과 테이블과 목표/결과 조합을 업데이트하는 다음 페이지로 ObjectiveID와 OutcomeID를 전달하는 Querystring이있는 URL이 채워집니다 .

업데이트 페이지에는 양식에 체크 박스를 채우는 쿼리가 있습니다. KSA 테이블은 목록 항목을 채우고 OutcomesKSA 테이블은 이전에 사용자가 입력 한 모든 데이터를 선택란 (부울 인 OutcomesKSA.KSA_Value 필드) 형식으로 제공합니다. ObjOut 테이블은 목표 테이블과 결과 테이블을 연결하는 접합 테이블입니다.

사용자가 입력 한 체크 박스 데이터가 존재하면 (부울 인 OutcomesKSA.KSA_Value 필드) 아직 양식 만 얻을 경우 해당 응용 프로그램에서 특정 목표/결과 조합에 대한 데이터 만 얻고 싶습니다. OutcomesKSA 테이블에 데이터가 입력되지 않은 경우 KSA 테이블의 목록.

현재 사용중인 쿼리로는 아무 것도 채워지지 않습니다 (아래 참조).

이 문제에 도움을 주셔서 감사합니다.

Objectives table 
ID 
5 

Outcomes table 
ID 
4 


ObjOut table 
ID|ObjectiveID|OutcomeID 
1|5|4 

OutcomesKSA table 
ID|ObjOutID|KSA_ID 
2|1|1 
3|1|2 
4|1|3 


KSA table 
ID 
1 
2 
3 

쿼리 : 여기

데이터는 테이블에서 테이블에 나타납니다 데이터 분산 및 관련 방법을 보여하는 방법 (I는 자신의 관계를 보여 PK와 및 FKS을 포함 시켰습니다) :

SELECT 
KSA.ID as KSA_ID, KSA.KSA_Version, KSA.KSA_Sort_Order_Number, 
KSA.KSA_Outcome_Number, KSA.KSA_Category as KSA_KSA_Category, 
KSA.KSA_Category_Sub_Num, KSA.KSA_Category_Sub_Num_Descr, 
KSA.KSA_Category_Sub_Num_Sub_Alpha, KSA.KSA_Category_Sub_Num_Sub_Alpha_Descr, 
KSA.KSA_ID as KSA_KSA_ID, KSA.KSA_Descr_Combined as KSA_KSA_Descr_Combined, 
KSA.LastUpdate, KSA.Date_Created, 

OutcomesKSA.KSA_ID as OutcomesKSA_KSA_ID,OutcomesKSA.KSA_Value as OutcomesKSA_KSA_Value,OutcomesKSA.ObjOutID, 

ObjOut.ObjectiveID, ObjOut.OutcomeID, 

Objectives.ID as Obj_Obj_ID 


FROM 
KSA 
LEFT OUTER JOIN 
OutcomesKSA 
ON 
KSA.ID=OutcomesKSA.KSA_ID 
INNER JOIN 
ObjOut 
ON 
OutcomesKSA.ObjOutID=ObjOut.ID 
INNER JOIN 
Objectives 
ON 
ObjOut.ObjectiveID=Objectives.ID 

WHERE 
KSA.KSA_Outcome_Number ='1' 
AND 
KSA.KSA_Category ='k' 
AND 
Objectives.ID ='29' 

ORDER BY KSA.KSA_Sort_Order_Number ASC; 

표 :

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Objectives](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [CourseID] [int] NOT NULL, 
    [Objective] [varchar](max) NULL, 
    [LastUpdate] [datetime] NULL, 
    [Date_Created] [datetime] NULL, 
CONSTRAINT [PK_Objectives] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[Objectives] WITH NOCHECK ADD CONSTRAINT [FK_Objectives_Courses] FOREIGN KEY([CourseID]) 
REFERENCES [dbo].[Courses] ([CourseID]) 
ON UPDATE CASCADE 
GO 

ALTER TABLE [dbo].[Objectives] CHECK CONSTRAINT [FK_Objectives_Courses] 
GO 

ALTER TABLE [dbo].[Objectives] ADD CONSTRAINT [DF_Objectives_Date_Created] DEFAULT (getdate()) FOR [Date_Created] 
GO 

============= 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[Outcomes](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [OutcomeGroup] [varchar](50) NULL, 
    [OutcomeType] [varchar](50) NULL, 
    [OutcomeNumber] [int] NULL, 
    [OutcomeName] [varchar](500) NULL, 
    [OutcomeDescription] [varchar](max) NULL, 
    [OutcomeVersionYear] [varchar](50) NULL, 
    [OutcomeVersionSemester] [varchar](50) NULL, 
    [LastUpdate] [datetime] NULL, 
    [Date_Created] [datetime] NULL, 
CONSTRAINT [PK_Outcomes] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[Outcomes] ADD CONSTRAINT [DF_Outcomes_Date_Created] DEFAULT (getdate()) FOR [Date_Created] 
GO 


========== 


SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[ObjOut](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [ObjectiveID] [int] NULL, 
    [OutcomeID] [int] NULL, 
    [LastUpdate] [datetime] NULL, 
    [Date_Created] [datetime] NULL, 
CONSTRAINT [PK_ObjOut] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[ObjOut] WITH CHECK ADD CONSTRAINT [FK_ObjOut_Objectives] FOREIGN KEY([ObjectiveID]) 
REFERENCES [dbo].[Objectives] ([ID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[ObjOut] CHECK CONSTRAINT [FK_ObjOut_Objectives] 
GO 

ALTER TABLE [dbo].[ObjOut] WITH CHECK ADD CONSTRAINT [FK_ObjOut_Outcomes] FOREIGN KEY([OutcomeID]) 
REFERENCES [dbo].[Outcomes] ([ID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[ObjOut] CHECK CONSTRAINT [FK_ObjOut_Outcomes] 
GO 

ALTER TABLE [dbo].[ObjOut] ADD CONSTRAINT [DF_ObjOut_Date_Created] DEFAULT (getdate()) FOR [Date_Created] 
GO 







=========== 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[OutcomesKSA](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [ObjOutID] [int] NOT NULL, 
    [KSA_ID] [int] NULL, 
    [KSA_Value] [bit] NULL, 
    [LastUpdate] [datetime] NULL, 
    [Date_Created] [datetime] NULL, 
CONSTRAINT [PK_OutcomesKSA] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

ALTER TABLE [dbo].[OutcomesKSA] WITH CHECK ADD CONSTRAINT [FK_OutcomesKSA_ObjOut] FOREIGN KEY([ObjOutID]) 
REFERENCES [dbo].[ObjOut] ([ID]) 
ON UPDATE CASCADE 
ON DELETE CASCADE 
GO 

ALTER TABLE [dbo].[OutcomesKSA] CHECK CONSTRAINT [FK_OutcomesKSA_ObjOut] 
GO 

ALTER TABLE [dbo].[OutcomesKSA] ADD CONSTRAINT [DF_OutcomesKSA_Date_Created] DEFAULT (getdate()) FOR [Date_Created] 



========================= 







SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

SET ANSI_PADDING ON 
GO 

CREATE TABLE [dbo].[KSA](
    [ID] [int] IDENTITY(1,1) NOT NULL, 
    [KSA_Version] [varchar](50) NULL, 
    [KSA_Sort_Order_Number] [int] NULL, 
    [KSA_Outcome_Number] [varchar](50) NULL, 
    [KSA_Outcome_Number_Sort] [varchar](50) NULL, 
    [KSA_Category] [char](1) NULL, 
    [KSA_Category_Sub_Num] [varchar](50) NULL, 
    [KSA_Category_Sub_Num_Sort] [varchar](50) NULL, 
    [KSA_Category_Sub_Num_Descr] [varchar](max) NULL, 
    [KSA_Category_Sub_Num_Sub_Alpha] [char](1) NULL, 
    [KSA_Category_Sub_Num_Sub_Alpha_Descr] [varchar](1000) NULL, 
    [KSA_ID] [char](8) NULL, 
    [KSA_ID_Sort] [char](8) NULL, 
    [KSA_Descr_Combined] [varchar](max) NULL, 
    [LastUpdate] [datetime] NULL, 
    [Date_Created] [datetime] NULL, 
CONSTRAINT [PK_KSA] PRIMARY KEY CLUSTERED 
(
    [ID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[KSA] ADD CONSTRAINT [DF_KSA_Date_Created] DEFAULT (getdate()) FOR [Date_Created] 
GO 
+2

이 SQL은 나에게 두통을 제공합니다. 그러나 관계없이 SELECT 문에서 가져온 결과는 무엇입니까? – Siyual

+0

나는 당신이 무슨 뜻인지 안다. SELECT 문에서 반환되는 행은 0 개입니다. – buck1112

답변

1

후자 INNER JOINs이 EFFE 있습니다 대체로 OUTER JOININNER으로 되돌립니다. 여러 테이블이 함께 INNER JOINed이되도록 쿼리를 구성 할 수 있으며 해당 집합은 OUTER JOIN으로 적용됩니다.

또한 WHERE 절 조인 모든 후에 적용되며 WHERE 절과 ON 절에 필터를 배치하는 사이에 차이가있는 OUTER JOIN 너무, 전체 행을 필터링한다.

코딩 스타일에 대한 부가 정보. 코드 작성 방식에는 많은 개인적인 선호가 있지만 일반적으로 읽고 이해하기 쉽도록 목표를 설정해야합니다. 6 개월 후에 작성한 내용을 이해하려고 할 때뿐만 아니라 다른 사람에게 코드를 제시 할 때와 다른 형식을 고려하는 것이 좋습니다.

이 모든 것을 합치면 원하는 것보다 많을 것입니다.

SELECT 
    KSA.ID as KSA_ID 
    ,KSA.KSA_Version 
    ,KSA.KSA_Sort_Order_Number 
    ,KSA.KSA_Outcome_Number 
    ,KSA.KSA_Category as KSA_KSA_Category 
    ,KSA.KSA_Category_Sub_Num 
    ,KSA.KSA_Category_Sub_Num_Descr 
    ,KSA.KSA_Category_Sub_Num_Sub_Alpha 
    ,KSA.KSA_Category_Sub_Num_Sub_Alpha_Descr 
    ,KSA.KSA_ID as KSA_KSA_ID 
    ,KSA.KSA_Descr_Combined as KSA_KSA_Descr_Combined 
    ,KSA.LastUpdate 
    ,KSA.Date_Created 
    ,OutcomesKSA.KSA_ID as OutcomesKSA_KSA_ID 
    ,OutcomesKSA.KSA_Value as OutcomesKSA_KSA_Value 
    ,OutcomesKSA.ObjOutID 
    ,ObjOut.ObjectiveID 
    ,ObjOut.OutcomeID 
    ,Objectives.ID as Obj_Obj_ID 
FROM 
    KSA 
    LEFT OUTER JOIN (
     OutcomesKSA 
     INNER JOIN ObjOut 
      ON OutcomesKSA.ObjOutID = ObjOut.ID 
     INNER JOIN Objectives 
      ON ObjOut.ObjectiveID = Objectives.ID 
    ) ON KSA.ID = OutcomesKSA.KSA_ID 
     AND Objectives.ID = 29 --filter 
WHERE 
    KSA.KSA_Outcome_Number = '1' 
    AND KSA.KSA_Category = 'k' 
ORDER BY KSA.KSA_Sort_Order_Number; 
+0

대단히 도움이됩니다. 철저한 답변과 협조에 감사드립니다. – buck1112

+0

는 그것뿐만 아니라, 왼쪽 OUTER가 형제 테이블의 가입 얻을 수 있을까요? 새로운 테이블은 KSA 테이블과 동일한 레벨, 동일 관계에 첨가 하였다. 모두 KSA 테이블 및 새 테이블, 자격 KSA_Priority는 KSA_Out 접합 테이블의 외래 키가 있습니다. 이 같은 쿼리 내에서 가능할 것이다는 KSA 및 KSA_Priority 테이블 모두에서 모든 결과를 얻으려면? 감사. – buck1112