【发布时间】:2022-01-18 13:42:11
【问题描述】:
我目前正在尝试编写一个 SQL 查询,用于查找任何行具有相同 x 和 y 值的任何冲突。
这是我目前正在使用的表格:
CREATE TABLE Slot (
sid INT,
wall varchar(200),
x FLOAT,
y FLOAT,
PRIMARY KEY (sid)
)
CREATE TABLE Route (
rid INT,
name varchar(200),
circuit varchar(200),
PRIMARY KEY (rid)
)
CREATE TABLE Placement (
rid INT FOREIGN KEY REFERENCES Route(rid),
hid INT FOREIGN KEY REFERENCES Hold(hid),
sid INT FOREIGN KEY REFERENCES Slot(sid)
)
所以我试图找到任何在同一面墙上并且具有相同 x 和 y 值的插槽。除此之外,我希望它们都是相同的 Route 电路。
我不知道我是否应该尝试使用“展示位置”的第三个表,因为我对此很陌生,并且在尝试加入它们时感到困惑,因为它们没有任何共享列。
这是我目前拥有的
SELECT
DISTINCT
S.sid
FROM
Slot as S,
Route as R
WHERE
R.circuit = 'Beginner'
GROUP BY
S.x,
S.y,
S.wall
HAVING
COUNT(*) > 1
但这会引发错误,因为我必须在 GROUP BY 或聚合函数中使用“S.sid”,但我不想按此分组。
以下是我用来尝试的 INSERT 函数,并作为我目前所拥有的示例。
INSERT INTO Slot (sid, wall, x, y) VALUES (2345, 'south', 4, 7)
INSERT INTO Slot (sid, wall, x, y) VALUES (4534, 'south', 4, 7)
INSERT INTO Slot (sid, wall, x, y) VALUES (2456, 'west', 1, 7)
所以这里它会返回 sid 的 2345 和 4534,因为它们都在南墙上并且具有相同的 x 和 y 值。
【问题讨论】:
-
您需要将
NOT NULL添加到您的CREATE TABLE语句中,否则您的列将默认为空(这也不应该是默认值...) -
我们是否还需要您的
Route和Placement表的示例数据? -
提示:不要使用 ancient "comma in
FROM"-syntax 连接。始终使用显式连接:a-gentle-introduction-to-sql.readthedocs.io/en/latest/part3/… -
如果
x和y代表坐标,那么你应该使用decimal,而不是float。float类型是近似类型,因此您无法执行(有意义的)相等检查。所以尽可能避免使用float(和real)。 -
“除此之外,我希望它们都是相同的 Route 电路。” Placement 表已经允许相同的
Slot(因为该表上根本没有PK 或UNIQUE约束),此语句是模棱两可的。 (Hold表的目的是什么?它如何影响您对“重复”数据的定义?),如果多个Slot行具有相同的wall,x,y值但没有任何对应的@,也会发生什么情况987654344@ 行?或者多个Placement行对应Slot中的相同和非重复 行?
标签: sql azure-data-studio