【问题标题】:Merging columns from 2 tables to a single table in MS SQL 2014在 MS SQL 2014 中将 2 个表中的列合并到一个表中
【发布时间】:2014-11-13 22:31:46
【问题描述】:

我用这个link 来帮助我到达我所在的位置,但现在我的输出是错误的。

我有 2 列,TableA 中的 ColumnA 和 Table B 中的 ColumnB。我希望 TableC 包含 2 列,即 ColumnA 和 ColumnB。 MatchA 和 MatchB 是相同的。 MatchA 在 TableA 中,MatchB 在 TableB 中。 @InputVal 是从 ColumnA + B 中选择值的方式。这是我所做的:

SELECT ColumnA, ColumnB
FROM TableA, TableB
WHERE MatchA=MatchB
AND MatchA=@InputVal

这会产生输出:

ColumnA   ColumnB
44        Test1
45        Test1
46        Test1
44        Test2
45        Test2
46        Test2
44        Test3
45        Test3 
46        Test3

什么时候,从逻辑上讲,应该是:

ColumnA   ColumnB
44        Test1
45        Test2
46        Test3

如何纠正我的逻辑以修复缺陷?我已经经历了语句构造的许多变体,但我似乎无法理解它。 谢谢。

编辑:用户 snow_FFFFFF 有正确的解决方案,但只是因为我遗漏了一个细节而遗漏了一部分。

SELECT TableA.ColumnA, TableB.ColumnB
FROM TableA INNER JOIN TableB ON TableA.MatchA = TableB.MatchB
AND TableA.SecondMatchA=TableB.SecondMatchB --The change needed

【问题讨论】:

  • 您要匹配哪些列?

标签: sql-server


【解决方案1】:

我想你想加入你的桌子:

SELECT TableA.ColumnA, TableB.ColumnB
FROM TableA INNER JOIN TableB ON TableA.MatchA = TableB.MatchB

INNER JOIN 只会返回每个匹配的行。 LEFT OUTER JOIN(而不是 INNER JOIN)将为您提供 TableA 中的所有行和 TableB 中连接成功的值。

现在,您正在使用表之间的逗号执行 CROSS JOIN。

【讨论】:

  • 这是我的想法,但没有理解 matcha=matchb 部分
  • 感谢您的努力,但您的解决方案不起作用的原因是我的错。我遗漏了一个必须匹配才能使流程正常工作的辅助变量。跟随主题,除了我需要AND TableA.SecondMatchA=TableB.SecondMatchB之外,该解决方案与您的解决方案相匹配。
【解决方案2】:

尝试使用 UNION SELECT 合并两个表中的列,如下所示:

SELECT TableB.ColumnB FROM TableB
UNION ALL
SELECT TableA.ColumnA FROM TableA WHERE TableA.MatchA = @InputVal

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-23
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2017-02-09
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多