【问题标题】:How to compare two sets in MySQL or SQL SERVER?如何比较 MySQL 或 SQL SERVER 中的两组?
【发布时间】:2021-06-13 22:33:40
【问题描述】:

在这个大学数据库中:

CREATE TABLE Stud(
    [S#] INT PRIMARY KEY,
    Sname NVARCHAR(50),
    City NVARCHAR(50),
    GPA FLOAT,
    [Clg#] SMALLINT
);

CREATE TABLE Sec(
    [Sec#] SMALLINT,
    [C#] INT,
    [S#] INT,
    Semester SMALLINT,
    Pname NVARCHAR(50),
    Score NVARCHAR(30),
    PRIMARY KEY([Sec#], [C#], Semester)
);

Stud
Sec#,C#,S#,Semester,Pname,Score
1724,10172,1133848,161,Sullivan,62%
1516,51516,4182532,152,Cooper,73%
1747,10174,1133848,152,Sullivan,75%
1747,10174,2130502,153,Sullivan,55%
1540,10156,2203305,161,Sullivan,60%
1540,10156,1133848,181,Sullivan,87%
1540,10156,2203305,182,Sullivan,40%
1802,10156,4182532,192,Sullivan,60%

Sec
S#,Sname,City,GPA,Clg#
1133848,Parker,NY,3.8,10
2130502,White,Chicago,2.8,10
2203305,Gardner,LA,3.5,1
3120504,West,Boston,3.85,4
3166801,Warren,Seattle,3.2,5
4182532,Rogers,NY,3.3,5
4209836,Allen,Austin,1.5,6

我有这个问题:

查找参加过所有沙利文老师教授的课程的学生的姓名和 ID。

我可以很容易地用关系代数找到答案:

Π ????#,????????????????????,????#(???????????????? ⋈ ????????????) ÷ Π c#(σ pname="Sullivan" (sec))
  1. 如何在 SQL 中实现除法运算符?

我们的老师给了我们这个 SQL SERVER 的答案:

???????????????????????? ????????????????.????#, ????????????????????
???????????????? ????????????????, ????????????
???????????????????? ????????????????.????# = ????????????.????#
???????????????????? ???????? ????????????????.????#, ????????????????????
???????????????????????? ????# ???????????????????????????????? (???????????????????????? DISTINCT ????#
???????????????? ????????????
WHERE pname ="Sullivan");

从我们在线课程的幻灯片中,这就是他们所说的CONTAINS

  1. 但从我google的结果来看,contains函数与集合无关,它似乎是一个全索引的测试搜索函数。如果我错了,请纠正我。

一段时间后,我想出了这个解决方案:

SELECT Stud.* FROM Stud WHERE S# IN
(SELECT S#/*,COUNT(DISTINCT C#) as c*/ FROM Sec WHERE Pname='Sullivan' GROUP BY S# HAVING COUNT(DISTINCT C#)=
(SELECT COUNT(DISTINCT [C#]) FROM Sec WHERE Pname='Sullivan'));

【问题讨论】:

  • 你的老师真的应该学习明确的JOIN语法。
  • 这个查询是写在石碑上的吗?!
  • 这个查询在很多方面都很奇怪。可以换别的班吗?
  • 除法运算符在 SQL 中没有直接等价物。通常通过使用子查询和比较 COUNT() 来解决它。
  • contains function 与 sets 无关 正确 - 它基于全文索引。如果该解决方案应该在 SQL Server 中“正确”工作,那么您的老师就是在浪费您的时间和金钱。这是您第二次发布这样的问题 - 要么使用您老师使用的数据库引擎,要么找到其他课程。

标签: mysql sql sql-server relational-database relational-algebra


【解决方案1】:

堵嘴。这似乎回答了这个问题:

SELECT stud.s#, stud.sname
FROM stud s JOIN
     sec
     ON stud.s# = sec.s# 
WHERE secs.pname = 'Sullivan'
GROUP BY stud.s#, sname
HAVING COUNT(DISTINCT sec.c#) = (SELECT COUNT(DISTINCT sec2.c# FROM sec sec2 WHERE sec2.pname = 'Sullivan');

让我说我对老师没有印象:

  • 永远不要FROM 子句中使用逗号。
  • 始终使用正确、明确、标准、可读的JOIN语法。
  • CONTAINS() 是 SQL Server 全文函数。它在 MySQL 中不存在。而且我还没有听说过它用作集合运算符。
  • . 之后的空格是非标准的。 . .我也建议使用表别名。

【讨论】:

    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 2020-12-03
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2020-07-01
    • 1970-01-01
    相关资源
    最近更新 更多