【问题标题】:How can I pull off an INSERT, SELECT, JOIN, and CAST query with Microsoft SQL Server Management Studio?如何使用 Microsoft SQL Server Management Studio 执行 INSERT、SELECT、JOIN 和 CAST 查询?
【发布时间】:2018-04-24 15:55:57
【问题描述】:

我一直在尝试建立一个测试数据库,但在从标准化形式中提取数据时一直遇到问题。

下面是我一直在处理的最新版本的 SQL 查询。

INSERT INTO TestData.dbo.Info (Name,Did)
SELECT DISTINCT a.Name, b.Did
FROM StageDB.dbo.MockData a INNER JOIN Testdata.dbo.Dinfo b
ON a.Name = CAST(b.Did as varchar(10))

我得到的输出如下:

(0 行受影响)

我一直在尝试自己解决这个问题,但似乎无法让它按照我想要的方式工作。

我的目标是提取数据(我的数据库中已有数据的表中的主键,Did 来自 int 类型的 TestData.dbo.Dinfo)并将其与我的暂存表中的数据(特定列从暂存数据库中的表 StageDB.dbo.MockData,类型为 varchar(10)) 的表中,然后插入到我的主数据库上的新表中。我试图将这些东西放入的数据库表都设置了正确的字段和类型(主键列,添加行时自动生成,名称列是 varchar(10),Did 列是 int) .

编辑:表定义、示例数据、所需结果

目标表:

TestData.dbo.Info

列:Iid(int,表的主键设置为在添加新记录时自动递增)、Name (varchar(10))、Did(int,来自 TestData.dbo.Dinfo 的外键)。

StageDB.dbo.MockData

列:此表中存在许多与我想要完成的内容无关的列。我唯一感兴趣的是包含我想与 Dinfo 表中的信息联系在一起的名称的列。名称 (nvarchar(255),null)。

TestData.dbo.Dinfo

列:Did (int, primary key), Donor (varchar(20))。

数据样本

来自 Dinfo:

Did        Donor 
01         Howard L

来自模拟数据:

Name
Smith J

期望的结果

Iid      Name      Did
01       Smith J   01

任何帮助或建议将不胜感激。如果有人可以向我展示正确的 SQL 语法,我真的很高兴,因为我认为这可能只是正确编写它的问题。此外,任何可以帮助我了解更多 SQL 的技巧或网站都将不胜感激。

谢谢!

【问题讨论】:

  • a.Name = b.Dib.是你的问题。 a.Name 在那个JOIN 中隐式转换为int。而且,正如您已经看到的,'CA123' 无法转换为 int
  • 你想用那个 WHERE 子句做什么?
  • @TabAlleman 我怀疑这是一种更糟糕的(非SARGable)形式,当人们做WHERE 1=1; 之类的愚蠢事情时,他们可以轻松添加一个(毫无意义的)WHERE 子句稍后。
  • @Larnu 谢谢你的指点,你对 WHERE 子句的看法是对的,哈哈

标签: sql sql-server join subquery sql-insert


【解决方案1】:

改变这个:

ON a.Name = b.Did

到这里:

ON a.Name = CAST(b.Did as varchar(10))

我怀疑您的查询在获得您想要的结果方面存在更多错误,但这应该可以解决您的错误。

【讨论】:

  • CAST 中缺少右括号。
  • @TabAlleman 你是对的。它确实修复了错误,但没有提供我想要的结果。它只返回了 0 行受影响的消息。我不确定为什么它不起作用。您曾说过我的查询可能有更多错误;你觉得什么?感谢您的帮助!
  • @LionOrion WHERE 子句和 ON 子句都看不上我。在 name=ID 上加入是不寻常的。通常是 ID=ID 或 name=name。 where 子句基本没用,比如说 WHERE 1=1。如果您编辑问题并添加表格定义、示例数据和所需结果,我可能会给您一个明确的解决方案。
  • @TabAlleman 我已经进行了编辑。希望它们是您正在寻找的东西,以便能够提供帮助。如果有任何不清楚的地方,请告诉我。感谢您的帮助!
【解决方案2】:

您需要找出错误发生的位置。有三种可能:

  1. mockdata.name 是字符串,NInfo.data 是整数
  2. dinfo.did 是字符串,NInfo.did 是整数
  3. mockdata.name 是字符串,dinfo.did 是整数(反之亦然)

根据命名约定,第三种可能性最大。将数字与字符串进行比较时,字符串将转换为数字。但是,每次使用隐式类型转换时都需要小心。

如果是第三个选项,那么您可以将整数转换为字符串(正如其他答案所建议的那样)。但是,我会问你为什么要进行这样的比较。

【讨论】:

  • 第三个选项确实是正确的。除了学习更多 SQL 之外,我还试图规范化一些数据。数据可以从几个不同的来源中提取,我试图以一种将信息与其他信息相关联的方式进行设置。根据您的建议(以及其他人的建议),我能够清除错误,但无法将数据插入到新表中。执行查询后,返回 0 行受影响。关于如何将两条数据一起插入到新表中的任何想法?
【解决方案3】:

错误出现在ON a.Name = b.Did 名称列中可能包含字母、数字或特殊字符。列是否仅包含数字或仅整数。

【讨论】:

  • 是的,Name 是一个包含字母和数字的 varchar,Did 列只是一个整数。我用 Tab 的建议解决了这个问题,但后来我的插入没有像我想要的那样将数据写入表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2013-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多