【问题标题】:getting subquery error in SQL在 SQL 中获取子查询错误
【发布时间】:2017-10-12 00:33:57
【问题描述】:

尝试使用我当前的表插入到某个表中。这是我当前 Temptable 的结构:

CustomerID  Name        Values      FakeName
1           John        10apples    10apples_20oranges_30bananas
1           John        20oranges   10apples_20oranges_30bananas
1           John        30bananas   10apples_20oranges_30bananas
2           Steve       15apples    15apples_25oranges_35bananas
2           Steve       25oranges   15apples_25oranges_35bananas
2           Steve       35bananas   15apples_25oranges_35bananas
3           Harvey      10apples    10apples_20oranges_30bananas
3           Harvey      20oranges   10apples_20oranges_30bananas
3           Harvey      30bananas   10apples_20oranges_30bananas

这是我正在执行的代码片段:

Insert into customer (FakeName,type,address)
select (select distinct FakeName from Temptable),
        2,
        xyz

 from customer c
 where c.fakename not in (select distinct Fakename from TempTable)

关注error

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的

我想从temptablecustomer 表中插入不同的假名,确保假名已经存在然后不要插入重复的假名

【问题讨论】:

  • 为什么要从子查询中选择而不是只选择c.fakename 本身?

标签: sql sql-server sql-server-2008 subquery mysql-dependent-subquery


【解决方案1】:

select distinct FakeName from Temptable 不是标量,所以不能这样使用。

我想这就是你所追求的:

Insert into customer (FakeName,type,address)
select distinct 
        FakeName,
        2,
        xyz
 from Temptable c
 where c.fakename not in (select distinct Fakename from customer)

【讨论】:

  • 我试过了,但它正在插入重复项。就像我做“从客户中选择 * '10apples_20oranges_30bananas' 中的 FakeName ”一样,它给了我 3 个具有相同 FakeName 的输出。我的期望是只看到 1 个
  • Distinct 删除重复项。 “重复”是指相同的 FakeName 出现两次吗?那是因为列 xyz 具有不同的值。你需要选择你想要的 xyz。
  • 运行这个:select distinct FakeName from Temptable 你看到重复了吗?
  • 这个怎么样:select distinct LTRIM(RTRIM(FakeName) from Temptable如果你仍然看到它们,你能把它们的截图贴出来
  • 我的意思是select distinct LTRIM(RTRIM(FakeName)) from Temptable(忘了括号)
【解决方案2】:

我想你想要这样的东西:

Insert into customer (FakeName, type, address)
    select distinct tt.FakeName, 2, 'xyz'
    from temptable tt
    where not exists (select 1 from customer c where c.fakename = tt.fakename);

注意事项:

  • xyz 在您的查询中未定义(除非它是客户中的列,这似乎不太可能)。
  • 如果子查询的任何名称为NULLnot in 将过滤所有行。我将其替换为not exists
  • 我推测您想避免customer 中的重复条目,所以我更改了子查询。
  • in/not in 与子查询一起使用时,select distinct 是多余的。

【讨论】:

  • 我试过了,但它正在插入重复项。就像我做“从客户那里选择 * '10apples_20oranges_30bananas' 中的 FakeName ”一样,它给了我 6 个具有相同 FakeName 的输出。我的期望是只看到 1 个
  • @achillies1987 。 . .也许重复项看起来相同,但不同之处在于包含空格、隐藏字符或看起来相同的字符。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 2012-12-29
  • 2019-01-23
  • 2017-02-08
  • 1970-01-01
相关资源
最近更新 更多