内部查询where子句依赖于外部查询属性

时间:2016-09-14 17:49:34

标签: sql sql-server

鉴于这三个表:

学生(sID,sName);    课程(cID,cName);和研究(sID,cID)

研究包含三个具有相同sID和不同cID的元组,即一名学生正在学习三门不同的课程。

我正在尝试执行以下查询:

select s.sID, s.sName
from Student s
where 'sID1' in
      (select st.sID
       from Studies st
       where st.sID = s.sID);

据我所知,在运行查询时,应该打印所有三个元组。但是只打印了一个元组。到目前为止,我已经得出结论,这是因为内部查询中的where-clause where st.sID = s.sID,但我无法理解其背后的逻辑。是因为该子句依赖于外部查询吗?为什么只打印一个元组而不是全部三个?

3 个答案:

答案 0 :(得分:1)

我不知道您的要求,但您使用以下语法编写的内容更具可读性:

select s.sID, s.sName
from Student s
inner join Studies st on st.sID = s.sID

答案 1 :(得分:0)

您的查询应该只返回一个元组,因为sID1与单个学生相关..

import visa;
visa.log_to_screen();
rm=visa.ResourceManager()
2016-09-14 19:50:27,600 - pyvisa - DEBUG - No user defined library files
2016-09-14 19:50:27,605 - pyvisa - DEBUG - Automatically found library files: ['C:\\WINDOWS\\system32\\visa32.dll', 'C:\\WINDOWS\\system32\\visa32.dll']
2016-09-14 19:50:27,607 - pyvisa - DEBUG - Library signatures: 90 ok, 0 failed
2016-09-14 19:50:27,607 - pyvisa - DEBUG - Created library wrapper for C:\WINDOWS\system32\visa32.dll
rm.list_resources()
2016-09-14 19:54:27,746 - pyvisa - DEBUG - viOpenDefaultRM('<ViObject object at 0x00000000054A0748>',) -> 0
2016-09-14 19:54:27,746 - pyvisa - DEBUG - Created ResourceManager with session 4097
2016-09-14 19:54:27,994 - pyvisa - DEBUG - viFindRsrc(4097, '?*::INSTR', '<ViObject object at 0x00000000054A0748>', 'c_ulong(1)', <ctypes.c_char_Array_256 object at 0x00000000054A0CC8>) -> 0
('USB0::0x0957::0x2007::MY49002886::INSTR',)
2016-09-14 19:54:27,994 - pyvisa - DEBUG - viClose(<ViObject object at 0x00000000054A0748>,) -> 0

在子查询中,如果您为sID1选择了更多的值,则由in子句解析,如单个结果

where 'sID1' in (select st.sID from Studies st where st.sID = s.sID); 子句是一个集合运算符

答案 2 :(得分:0)

在您的情况下,“IN”子句检查学生表的SId是否出现在学习表中。如果子查询中存在多个匹配项,则并不意味着查询应返回多个结果集。由于只有一个学生,查询返回一条记录。

IN子句用于检查或确保选择列表只返回IN条件中提到的值。