SQL 相同 table 的相关子查询
SQL correlated subquery of the same table
我有桌子:
Person(SSN, name, address)
Car(license, year, model)
Accident(license, accident-date, driver, damage-amount)
Owns(SSN, license)
问题是:
找出涉及不止一次事故的所有汽车的车牌号(不要 RETURN 重复)。
其中一个答案是:
SELECT DISTINCT A1.license
FROM Accident A1
WHERE A1.license IN (SELECT A2.license
FROM Accident A2
WHERE A1.accident-date <> A2.accident-date)
它从不检查相关子查询中的 A1.license = A2.license。因此,据我了解,子查询检查 A1 中的元组是否与 A2 中的元组具有不同的事故日期,即使这两个元组具有不同的许可证。所以这不应该是错误的吗?
编辑:假设一辆汽车一天内不会发生超过一次事故。
实际上 IN
操作员正在检查许可证是否相等。让我们做一个测试。假设 Accidents
table 包含行:
License AccidentDate
L1 20151001
L1 20151020
L2 20151025
为外部查询的每一行计算相关子查询。想象一个在行上循环的游标。
因为 row1
A.Licence
是 L1
。内部子查询只检查不同于 20151001
的日期,它会找到 row2
和 row3(L1, L3)
。所以 A.Licence
即 L1
在内部子查询的结果集中,它将在最终结果中返回。第二排也是。但是 row3
不会被包括在内,因为除了 20151025
之外的日期没有 L2
。所以查询正确。
我有桌子:
Person(SSN, name, address)
Car(license, year, model)
Accident(license, accident-date, driver, damage-amount)
Owns(SSN, license)
问题是:
找出涉及不止一次事故的所有汽车的车牌号(不要 RETURN 重复)。
其中一个答案是:
SELECT DISTINCT A1.license
FROM Accident A1
WHERE A1.license IN (SELECT A2.license
FROM Accident A2
WHERE A1.accident-date <> A2.accident-date)
它从不检查相关子查询中的 A1.license = A2.license。因此,据我了解,子查询检查 A1 中的元组是否与 A2 中的元组具有不同的事故日期,即使这两个元组具有不同的许可证。所以这不应该是错误的吗?
编辑:假设一辆汽车一天内不会发生超过一次事故。
实际上 IN
操作员正在检查许可证是否相等。让我们做一个测试。假设 Accidents
table 包含行:
License AccidentDate
L1 20151001
L1 20151020
L2 20151025
为外部查询的每一行计算相关子查询。想象一个在行上循环的游标。
因为 row1
A.Licence
是 L1
。内部子查询只检查不同于 20151001
的日期,它会找到 row2
和 row3(L1, L3)
。所以 A.Licence
即 L1
在内部子查询的结果集中,它将在最终结果中返回。第二排也是。但是 row3
不会被包括在内,因为除了 20151025
之外的日期没有 L2
。所以查询正确。