使用内部联接在SQL Server中选择查询问题

使用内部联接在SQL Server中选择查询问题,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,在SQL Server中,我试图获取必须为其分配以下科目的学生id: 'English', 'Tamil', 'Maths' 在其中,我需要获得学生id,今天分配的科目是“数学”,任何一天分配的科目是“英语”、“泰米尔语” 但是下面的查询检查所有指定日期的主题是今天 SELECT DISTINCT ca.student_id FROM student st INNER JOIN student_subject ON student_subject.student

在SQL Server中,我试图获取必须为其分配以下科目的学生id:

'English', 'Tamil', 'Maths'
在其中,我需要获得学生id,今天分配的科目是“数学”,任何一天分配的科目是“英语”、“泰米尔语”

但是下面的查询检查所有指定日期的主题是今天

SELECT DISTINCT 
    ca.student_id 
FROM 
    student st
INNER JOIN 
    student_subject ON student_subject.student_id = st.student_id 
INNER JOIN 
    subject ON subject.sub_id = student_subject.sub_id 
            AND student_subject_txt IN ('English', 'Tamil', 'Maths')  
            AND student_subject_assigned_Date = GETDATE()
GROUP BY
    ca.student_id 
HAVING
    COUNT(ca.student_id) = 3;

我不确定您的查询试图做什么,但如果您只希望结果的计数为3,请执行此操作(我将组更改为具有):

试试这个:

Select ca.student_id 
From student st
Where Exists 
   (Select * from student_subject mss
       join subject ms on ms.sub_id = mss.sub_id
    Where mss.student_id=st.student_id 
       And ms.student_subject_txt = 'Maths'
       And student_subject_assigned_Date = 
           dateAdd(day, DateDiff(day, 0, getdate()), 0))
And Exists 
   (Select * from from student_subject etss
       join subject ets on ets.sub_id = etss.sub_id
    Where etss.student_id=st.student_id 
       And ets .student_subject_txt in ('English', 'Tamil'))
注意:我将GetDate()更改为只生成日期值而不是当前日期和时间的表达式。GetDate()生成日期和时间,您将不会得到任何结果。
如果您使用的是SQL Server的最新版本,则可以将Getdate()强制转换为日期

Select ca.student_id 
From student st
Where Exists 
   (Select * from student_subject mss
       join subject ms on ms.sub_id = mss.sub_id
    Where mss.student_id=st.student_id 
       And ms.student_subject_txt = 'Maths'
       And student_subject_assigned_Date = Cast(getdate() as Date))
And Exists 
   (Select * from from student_subject etss
       join subject ets on ets.sub_id = etss.sub_id
    Where etss.student_id=st.student_id 
       And ets .student_subject_txt in ('English', 'Tamil'))

这应该行得通。请注意,您不需要区分

SELECT      ca.student_id 
FROM        student st
INNER JOIN  student_subject 
        ON  student_subject.student_id=st.student_id 
INNER JOIN  subject 
        ON  subject.sub_id=student_subject.sub_id 
WHERE       student_subject_txt in( 'English','Tamil', 'Maths')  
        AND (
                    (student_subject_txt = 'Maths' AND student_subject_assigned_Date = CONVERT(DATE, GETDATE()))
                OR  student_subject_txt <> 'Maths'
            )
GROUP BY    ca.student_id 
HAVING      COUNT(ca.student_id)=3;
选择ca.student\u id
来自student st
内联学生科
关于学生主题。学生id=圣徒学生id
内连接主语
关于subject.sub_id=学生subject.sub_id
学生的科目在哪里(‘英语’、‘泰米尔语’、‘数学’)
及(
(student_subject_txt='math'和student_subject_assigned_Date=CONVERT(Date,GETDATE()))
或学生科目“数学”
)
按ca.student\u id分组
具有计数(ca.student_id)=3;
编辑
@CharlesBretana是对的,您只需要比较
getdate()
的日期部分。相应地编辑。

为什么?你不能有两个
子句,我只能看到一个有语句。只是想弄清楚where筛选器正在进入(in仅检查与where筛选器匹配的记录)并对结果进行筛选。我看到2个
子句:)从您的代码中复制:“having ca.student_id having count(ca.student_id)=3;”抱歉,我粘贴错误,并一直“查看”最后一行的开头。更正了。
SELECT      ca.student_id 
FROM        student st
INNER JOIN  student_subject 
        ON  student_subject.student_id=st.student_id 
INNER JOIN  subject 
        ON  subject.sub_id=student_subject.sub_id 
WHERE       student_subject_txt in( 'English','Tamil', 'Maths')  
        AND (
                    (student_subject_txt = 'Maths' AND student_subject_assigned_Date = CONVERT(DATE, GETDATE()))
                OR  student_subject_txt <> 'Maths'
            )
GROUP BY    ca.student_id 
HAVING      COUNT(ca.student_id)=3;