【发布时间】: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