【问题标题】:SQL Select - Return same column twice based on IDs in another tableSQL Select - 根据另一个表中的 ID 两次返回同一列
【发布时间】:2016-06-18 11:36:33
【问题描述】:

假设我有下面的表(IDID2 分别是 PK/FK),我将如何设计一个查询,该查询会两次提取 detailTable.name 列,第一个表中的每个 ID 一次?

我想要的结果集是这样的:

+------+--------+------+---------+
| Name | Name 2 | Code | Created |
+------+--------+------+---------+
| Dave | Steven | AAAA | 1/10/10 |
+------+--------+------+---------+

我曾尝试使用两个连接来执行此操作,但一直收到此错误:

SELECT 
       DT.name as [Name 1], 
       DT.name as [Name 2]
       --other columns would go here

FROM linkTable LT 

LEFT JOIN
     detailTable DT
     ON LT.id2 = DT.id 
LEFT JOIN
     linkTable LT2
     ON LT2.id = DT.id
where DT.id = '74'

错误:将数据类型 nvarchar 转换为 bigint 时出错

链接表

+-----+-------+--------+-------------------------+-----------+
| ID  | ID2   | Code   | Created                 | CreatedBy |
+-----+-------+--------+-------------------------+-----------+
| 76  | 15157 | AAAA   | 1/1/10                  | 844       |
+-----+-------+--------+-------------------------+-----------+
| 77  | 15340 | AAAA   | 2015-11-24 15:12:25.057 | 842       |
+-----+-------+--------+-------------------------+-----------+
| 94  | 14644 | GEOFA  | 2015-11-13 15:01:19.977 | 842       |
+-----+-------+--------+-------------------------+-----------+
| 94  | 16346 | XX2222 | 2015-11-13 15:01:57.290 | 842       |
+-----+-------+--------+-------------------------+-----------+
| 108 | 15966 | EMPE   | 2015-11-25 12:38:37.377 | 842       |
+-----+-------+--------+-------------------------+-----------+

明细表

+-------+----------+
| ID    | Name     |
+-------+----------+
| 76    | Dave     |
+-------+----------+
| 15157 | Steven   |
+-------+----------+
| 94    | Roger    |
+-------+----------+
| 108   | Geoff    |
+-------+----------+
| 16346 | Penelope |
+-------+----------+
| 15966 | Paul     |
+-------+----------+
| 77    | Michael  |
+-------+----------+
| 14644 | Colin    |
+-------+----------+
| 15340 | Nigel    |
+-------+----------+

谢谢:)

【问题讨论】:

  • 所有三个 ID 列都是 bigint
  • 。 .如果所有 id 列都是数字,我看不出该错误是如何发生的。该查询显然不符合您的意图,但这是一个不同的问题。如果你把'74'的单引号去掉,你还会遇到同样的问题吗?
  • 我认为引号引起了问题,并且加入了错误的表格。谢谢!

标签: sql sql-server


【解决方案1】:

在正常情况下,left join 是不需要的,因为链接表应该只有有效的引用。选项卡指出,原始查询中的逻辑不正确。

我唯一的猜测是'74' 并不是真正的两位数字——隐藏字符或其他问题。无论如何,整数常量不需要单引号,所以你可以试试:

SELECT DT1.name as [Name 1], 
       DT2.name as [Name 2]
       --other columns would go here
FROM linkTable LT JOIN
     detailTable DT1
     ON LT.id1 = DT1.id JOIN
     detailTable DT2
     ON LT.id2 = DT2.id
WHERE DT.id = 74;

如果这不能解决问题,我会质疑所有 id 列都是bigint 的断言。正如所写,查询没有其他地方会发生这种类型转换。

【讨论】:

  • 这是正确的答案 - 引号一定是导致问题的原因。此外,我在初始查询中加入了错误的表。现在按预期工作 - 谢谢
【解决方案2】:

您想加入 Detail 表两次,而不是 Link 表:

SELECT 
       DT.name as [Name 1], 
       DT2.name as [Name 2]
       --other columns would go here

FROM linkTable LT 

LEFT JOIN
     detailTable DT
     ON LT.id = DT.id 
LEFT JOIN
     detailTable DT2
     ON LT.id2 = DT2.id
where LT.id = '74'

如果您仍然收到此格式的转换错误,则它可能位于示例中未显示的“其他列”之一中。

【讨论】:

  • 这修复了逻辑错误。你有解释为什么会发生类型错误吗? OP 声称所有 id 列都是数字的。我不明白为什么这个版本会解决这个问题。
  • 您是否在我编辑之前开始发表此评论(在代码块下方)?如果他对所涉及的数据类型正确,则 OP 发布的代码不可能发生类型错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-29
  • 2022-12-10
  • 2014-02-04
  • 2014-06-23
  • 1970-01-01
  • 2018-08-30
  • 1970-01-01
相关资源
最近更新 更多