2012-02-22 75 views
0

我有以下SQL查询:在SQL查询中,如何仅在特定条件下进行连接?

select Subjects.S_ID as ID, 
Subjects.S_ParentID as ParentID, 
Subjects.S_Name as Name, 
Subjects.S_Order as [Order], 
subjects.Sbj_IsVisible 
from Subjects 
left join KPI_SubjectDetails k on Subjects.S_ID = k.S_ID 
where 
subjects.Sbj_CourseID = 7594 
and subjects.Sbj_Type=2 
and subjects.Sbj_IsVisible=1 
order by subjects.S_Level, 
k.SD_Order 

每个主题都有一个s_ParentID。最顶端的主题有一个s_ParnetID为0. 我想添加一个SQL Join,它将执行以下操作: 如果父Subject设置为Sbj_IsVisible = 0(任何主题都可以是父级),那么SQL不应该输出它或它的任何孩子。但是,如果s_ParentID设置为0,我不想执行Sbj_IsVisible检查,因为这是最重要的主题。 这是我得到的:

select Subjects.S_ID as ID, 
Subjects.S_ParentID as ParentID, 
Subjects.S_Name as Name, 
Subjects.S_Order as [Order], 
subjects.Sbj_IsVisible 
from Subjects 
join Subjects_tbl st on Subjects.S_ParentID = st.S_ID and subjects.S_ParentID <> 0 
left join KPI_SubjectDetails k on Subjects.S_ID = k.S_ID 
where 
subjects.Sbj_CourseID = 7594 
and subjects.Sbj_Type=2 
and subjects.Sbj_IsVisible=1 
and st.Sbj_IsVisible = 1 
order by subjects.S_Level, 
k.SD_Order 

这部分工作。当父主题设置为sbj_Isvisible 0时,它不会返回其子级。 但是,如果最顶端的主题设置为sbj_IsVisible 1,则最高主体不会输出,但它的子主题会输出。

顺便说一句,这是一个在SQL Server 2008中

//编辑 添加一些示例数据。 这是原始查询的输出:

ID ParentID Name Order Sbj_IsVisible 
9017 0 'Boot Camp' 18 1 
9033 9017 1 4 1 
9049 9017 test 1 8 1 
9050 9049 test 2 1 1 

,这是我的查询的输出:

ID ParentID Name Order Sbj_IsVisible 
9033 9017 1 4 1 
9049 9017 test 1 8 1 
9050 9049 test 2 1 1 

这里的创建表的输出:

USE [Fox8] 
GO 

/****** Object: Table [dbo].[Subjects_tbl] Script Date: 02/22/2012 16:25:12 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[Subjects_tbl](
    [S_ID] [int] IDENTITY(1,1) NOT NULL, 
    [S_TopID] [int] NULL, 
    [S_ParentID] [int] NULL, 
    [S_Name] [nvarchar](255) NULL, 
    [S_Order] [int] NULL, 
    [S_ItemCount] [int] NOT NULL, 
    [S_Level] [int] NULL, 
    [S_IsInherited] [int] NOT NULL, 
    [S_SortType] [nvarchar](50) NULL, 
    [S_SortOrder] [nvarchar](50) NULL, 
    [OriginalSbj_CourseID] [int] NULL, 
    [Sbj_CourseID] [int] NOT NULL, 
    [Sbj_IsVisible] [int] NULL, 
    [Sbj_SkinType] [int] NULL, 
    [CopyOf_SubjectID] [int] NULL, 
    [Sbj_GUID] [uniqueidentifier] NULL, 
    [Sbj_type] [int] NULL, 
    [s_OriginalSubjectID] [int] NULL, 
    [OriginalEvalTree_SbjId] [int] NULL, 
    [S_IsDeleted] [smallint] NOT NULL, 
    [S_DateDeleted] [datetime] NULL, 
    [S_IsPrimary] [bit] NULL, 
CONSTRAINT [PK_Subjects] PRIMARY KEY CLUSTERED 
(
    [S_ID] ASC, 
    [S_ItemCount] ASC, 
    [Sbj_CourseID] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY], 
CONSTRAINT [UX_Subjects_S_ID_Sbj_CourseID] UNIQUE NONCLUSTERED 
(
    [S_ID] ASC, 
    [Sbj_CourseID] 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 

EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'bitwise field 1 for regular subject 2 for weighted Subject 4 for X of Y Subject' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'Subjects_tbl', @level2type=N'COLUMN',@level2name=N'Sbj_type' 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD CONSTRAINT [DF_Subjects_S_ItemCount] DEFAULT ((0)) FOR [S_ItemCount] 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD CONSTRAINT [DF_Subjects_S_IsInherited] DEFAULT ((1)) FOR [S_IsInherited] 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD CONSTRAINT [DF_Subjects_Sbj_CourseID] DEFAULT ((-1)) FOR [Sbj_CourseID] 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD DEFAULT ((0)) FOR [Sbj_SkinType] 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD CONSTRAINT [DF_Subjects_Sbj_IsEvaluation] DEFAULT ((1)) FOR [Sbj_type] 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD DEFAULT ((0)) FOR [S_IsDeleted] 
GO 

ALTER TABLE [dbo].[Subjects_tbl] ADD DEFAULT ((0)) FOR [S_IsPrimary] 
GO 
+2

如果您显示示例数据和期望的结果,那么帮助编写查询要比显示您尝试过的内容更容易,并试图描述它们的工作方式。 – 2012-02-22 14:16:23

+0

明白了。在这里写一些示例数据的最佳方式是什么? – jbkkd 2012-02-22 14:20:02

+1

显示'CREATE TABLE'语句和样例'INSERT'语句,然后以表格形式显示所需的结果。 – 2012-02-22 14:24:18

回答

1

你的问题是有点让我困惑,但让我建议使用OR从句,如:

SELECT s.S_ID AS ID, s.S_ParentID AS ParentID, s.S_Name AS Name, 
    s.S_Order AS [Order], s.Sbj_IsVisible 
FROM Subjects s 
LEFT JOIN Subjects_tbl st ON s.S_ParentID = st.S_ID 
LEFT JOIN KPI_SubjectDetails k ON s.S_ID = k.S_ID 
WHERE s.Sbj_CourseID = 7594 
    AND s.Sbj_Type=2 
    AND s.Sbj_IsVisible = 1 
    AND (st.Sbj_IsVisible = 0 OR s.S_ParentID = 0) 
ORDER BY s.S_Level, k.SD_Order 

本质上,从主题表中选择信息,如果它的相应父项不可见或者没有相应的父项(以及其他任何条件的含义)。

希望有帮助!

+0

这真的让我在需要的方向(除了我将st.Sbj_IsVisible = 0更改为1,因为我需要输出可见的),但是现在我遇到了另一个问题:如果有一个孩子孩子,现在输出,因为它的父主题被设置为不可见1.我可能需要找到一种不同的方法。不管怎么说,多谢拉! – jbkkd 2012-02-22 14:51:47

相关问题