gpt4 book ai didi

sql-server - SELECT 语句中的语法错误

转载 作者:行者123 更新时间:2023-12-01 06:17:00 25 4
gpt4 key购买 nike

以我有限的 SQL 知识,我无法解决这个问题。以下内容有什么问题:

DECLARE @Id int
DECLARE @Name varchar(40)

WHILE EXISTS
(
SELECT TOP 1 @Name = Name, @Id=ID FROM MyTable c WHERE <CONDITION>
)
BEGIN
SOME MORE SQL using @Id and @Name
END

我在 @Name = Name 附近遇到语法错误

编辑

为了向问题添加更多上下文,我有两个表,分别名为 Category (ID, Name, ParentID)Account(ID, Name, CategoryID)

有 3 个级别的类别

  1. 类别
  2. 子类别

这是使用递归关系 (ParentID > CategoryID) 实现的。要解决的问题是,如果有属于类别 X(级别 2)的任何 Accounts,我们必须

  1. 创建一个与 X 同名的子类别 Y(级别 3)
  2. 让 Y 成为那个 X 的 child
  3. 将所有帐户从 X 移至 Y

这是我写的原始脚本:

DECLARE @Id int
DECLARE @Name varchar(40)

WHILE EXISTS(
SELECT TOP 1 @Name=Name, @Id=CategoryID FROM Category c WHERE
ParentID = (SELECT TOP 1 CategoryID FROM Category WHERE Name = 'Root') AND
(SELECT COUNT(*) FROM Account WHERE CategoryID = c.CategoryID) > 0
)
BEGIN
INSERT INTO Category(Name, ParentID) VALUES(@Name, @Id)
UPDATE Account SET CategoryID = @@IDENTITY WHERE CategoryID = @Id
END

最佳答案

您可以使用 CURSOR 循环:

CREATE TABLE MyTable(ID INT, Name VARCHAR(100));
INSERT INTO Mytable(ID, Name) VALUES (1,10),(2,20);

DECLARE @Id int;
DECLARE @Name varchar(40);

DECLARE cur CURSOR FAST_FORWARD FOR SELECT Name,ID FROM MyTable c WHERE 1=1;

OPEN cur;
FETCH NEXT FROM cur INTO @Id, @Name;

WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Id,@Name;

FETCH NEXT FROM cur INTO @Id, @Name;
END;

CLOSE cur;
DEALLOCATE cur;

LiveDemo

请注意,TOP 1 没有明确的 ORDER BY 可能会在执行之间产生不同的结果。


EXISTS :

EXISTS subquery

注意 SELECT @ID = id, @Name = Name 不是子查询而是赋值。

CREATE TABLE MyTable(ID INT, Name VARCHAR(100));
INSERT INTO Mytable(Id, Name) VALUES (1,10),(2,20);

DECLARE @Id int;
DECLARE @Name varchar(40);

SELECT 1
WHERE EXISTS (SELECT @id = id FROM Mytable); -- assignment
-- Incorrect syntax near '='.

SELECT 1
WHERE EXISTS (SELECT id FROM Mytable); -- subquery

LiveDemo 2

关于sql-server - SELECT 语句中的语法错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37323328/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com