【问题标题】:Return value from another table that matches values from the first table从另一个表返回与第一个表中的值匹配的值
【发布时间】:2020-03-23 19:50:05
【问题描述】:

我有一个简单的问题。我有表 A 和 B,都包含 3 个公共列 (name, id, date),除了这 3 个之外,两个表都有完全不同的列集。

现在,出于可视化目的,我需要将表 B 中的数据关联到表 A。由于我对 SQL 不太擅长,所以我想我可以问一下这是否可能,我知道我可以有计算列,因为我已经在表 A 中有一个简单的东西。但是我想做这样的事情:

表 A 中的新列包含表 B 中“特殊”列的值,用于表 A 中的名称、日期和 ID 与表 B 的名称、日期和 ID 匹配的任何行,如果没有匹配项则保留为空白或为空。

例子

表 A:

Name | Date          | ID  | OtherData1     | OtherData2
-----+---------------+-----+----------------+-------------
John | March 2020    | SPC | Randomstuff    | randomstuff
Doe  | March 2020    | SPC | Randomstuff    | randomstuff
John | February 2020 | SPC | RandomStuff    | RandomStuff
Doe  | February 2020 | SPC | Randomstuff    | randomstuff

表 B:

Name | Date          | ID  | MoreData1     | SomeData2     | Special
-----+---------------+-----+---------------+---------------+--------
John | March 2020    | SPC | Randomstuff   | randomstuff   | True
Doe  | March 2020    | SPC | Randomstuff   | randomstuff   | False
John | February 2020 | SPC | RandomStuff   | RandomStuff   | True
Doe  | February 2020 | SPC | Randomstuff   | randomstuff   | True

表 A 中的结果:

Name | Date          | ID  | OtherData1    |OtherData2   | SpecialImported
-----+---------------+-----+---------------+-------------+----------------
John | March 2020    | SPC | Randomstuff   | randomstuff | True
Doe  | March 2020    | SPC | Randomstuff   | randomstuff | False
John | February 2020 | SPC | RandomStuff   | RandomStuff | True
Doe  | February 2020 | SPC | Randomstuff   | randomstuff | True

这可以在 SQL Server 中实现吗?

【问题讨论】:

  • 对表进行非规范化 (?!) 的替代方法是创建一个 view 来组合两个表中的数据。然后,您可以 select 视图中的数据,而无需担心底层查询。
  • 我的问题是我将两个表都拉到电源 bi 上,我试图从它们那里连接它们。问题还在于,与表 A 相比,表 B 在某些报告日期的数据要少得多,并且名称有时对于不同的 ID 是相同的。所以它会产生混淆数据可视化的模糊性。我想要做的是确保在名称、日期和 id 同时匹配时提取 SpecialImported 值,否则将其保留为空。感谢您的输入,因为我将使用它来显示数据问题

标签: sql sql-server tsql join


【解决方案1】:

是的,这是可能的。但是为了在计算列中引用另一个表,您必须通过创建用户定义的函数来完成。这将有 name,date,id 作为输入参数,如果表 B 中存在这样的组合,则会输出一点。类似于:

CREATE FUNCTION [dbo].[f_check_tableB_tuple](@name nvarchar(max),@date datetime,@ID nvarchar(max))

RETURNS bit
as
begin
declare @result bit
select @result=Special from tableB where name=@name and date=@date and ID=@ID

RETURN @result

end

然后,您可以在计算列中使用此函数:

alter table tableA add SpecialImported as (dbo.f_check_tableB_tuple(name,date,ID))

【讨论】:

  • 这似乎是我正在寻找的解决方案,因为我的表 A 和 B 通常每周都会收到新数据,我不想每次都运行脚本来执行此操作。我将如何创建一个函数并将其记录在我的 sql server 管理应用程序中?
  • 不确定我是否理解您的问题。只是...运行查询?就像您运行 SELECT 一样。
  • 那么对于函数,一旦我创建它并从新查询中运行它?会被sql保存吗?所以如果有任何新数据出现,我不必再次运行它?
  • 一个小问题,假设表 A 有一个不同的列名称,例如 B 表中的列是 Name、ID、Date,但在表 A 上,它的 MainName、ID、Date。我会在“@name”值上更改这个函数,它会是“@MainName”?
  • 没关系,小失误,我现在明白了,谢谢
【解决方案2】:

您正在描述left join

select a.*, b.special special_imported
from tablea a
left join tableb b
    on a.name = b.name
    and a.date = b.date
    and a.id = b.id

【讨论】:

  • 所以在表 A 上使用此查询,是否会将特殊匹配的名称、日期和 ID 列添加到表 A 中?每次更新表 A 和 B 时是否需要运行此查询?我的表 A 和 B 每周更新一次,并且正在寻找某种计算列,它可以让我保持这种状态,只要我更新 A 和 B,它就会自行更新
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-09-27
  • 1970-01-01
相关资源
最近更新 更多