使用内部联接在SQL Server中选择查询问题
在SQL Server中,我试图获取必须为其分配以下科目的学生id:使用内部联接在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
'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;