Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 避免在Matlab“join”和#x27中复制整个表;s_Sql_Matlab - Fatal编程技术网

Sql 避免在Matlab“join”和#x27中复制整个表;s

Sql 避免在Matlab“join”和#x27中复制整个表;s,sql,matlab,Sql,Matlab,我有一个记录和字段的表T。我想创建一个新字段,并用另一个表L的查找结果填充它。这意味着我将使用T中的一个或多个字段作为外键。在SQL中,我可以使用与表L的联接来更新表T中新创建的字段。相反,在执行联接时,Matlab不会更新现有表;这将创建一个全新的表,然后用于替换原始表T。填充一个字段似乎需要大量的数据复制。这是避免在引擎盖下吗?是否有一种代码设计模式或习惯用法可以避免这种情况,但仍然具有合理的可读性,并且不会在代码紧凑性方面做出太多妥协 当我在join的上下文中问这个问题时,我对避免Matl

我有一个记录和字段的表T。我想创建一个新字段,并用另一个表L的查找结果填充它。这意味着我将使用T中的一个或多个字段作为外键。在SQL中,我可以使用与表L的联接来更新表T中新创建的字段。相反,在执行
联接时,Matlab不会更新现有表;这将创建一个全新的表,然后用于替换原始表T。填充一个字段似乎需要大量的数据复制。这是避免在引擎盖下吗?是否有一种代码设计模式或习惯用法可以避免这种情况,但仍然具有合理的可读性,并且不会在代码紧凑性方面做出太多妥协

当我在
join
的上下文中问这个问题时,我对避免Matlab连接的所有变体中的表复制的策略感兴趣

我将描述一个示例,说明如何为
表1
中的每条记录使用
外键
表2
中查找
数据

        Table1
-----------------------------
SomeField NewField ForeignKey
--------- -------- ----------
someData1 dummy    a
someData2 dummy    b
someData3 dummy    a
someData4 dummy    b
someData5 dummy    a

Table2
--------
Key Data
--- ----
a   apple
b   banana
下面的SQL代码执行查找。然后,将
数据
字段中的条目与
表1
中的字段
SomeField
的内容连接起来,并存储到字段
新字段

UPDATE Table1 INNER JOIN Table2
ON Table1.ForeignKey = Table2.Key
SET Table1.NewField = Table1.SomeField & Table2.Data
更新后的
表1
为:

        Table1
------------------------------------
SomeField NewField        ForeignKey
--------- --------------- ----------
someData1 someData1apple  a
someData2 someData2banana b
someData3 someData3apple  a
someData4 someData4banana b
someData5 someData5apple  a

有趣的是,
表内部联接表2
实际上并没有创建。它只是“虚拟”创建的,用于启用更新表1的计算。相比之下,Matlab的
JOIN
创建了实际的连接表,并且需要单独的操作来进行计算。

我不是表方面的专家,但我可以深入了解Matlab如何使用这种类型的数据

MATLAB
对象包含每列的矩阵

在MATLAB中复制矩阵不会复制数据。MATLAB使用惰性复制。这意味着副本引用与原件相同的数据(直到副本或原件发生更改,此时才制作副本)。这种行为有很好的记录

因此,使用其他表中的整列创建新表将导致复制矩阵,但这些复制不会导致实际复制矩阵内容,新表引用原始表中的数据

但是,如果某列中的任何值发生更改,则需要复制整个列,以避免其他表看到相同的更改。该引用是内部的、临时的,用户不可见。出于所有目的,新表似乎包含原始数据的副本


但是,如果
join
操作导致交换或删除行,所有这些都是没有意义的。将复制数据。

您正在执行的操作必须如下所示:

table1 = table({'someData1';'someData2';'someData3';'someData4';'someData5'},...
   {'a';'b';'a';'b';'a'},'VariableNames',{'SomeField','ForeignKey'});
table2 = table({'a';'b'},{'apple';'banana'},'VariableNames',{'Key','Data'});

table3 = join(table1,table2,'LeftKeys','ForeignKey','RightKeys','Key')
这将生成下表:

SomeField外键数据
___________    __________    ________
“someData1”“a”“苹果”
“someData2”“b”“香蕉”
“someData3”“a”“苹果”
“someData4”“b”“香蕉”
“someData5”“a”“苹果”
然后对列
SomeField
Data
应用某种操作

我认为添加了这个
join
函数是为了方便那些熟悉SQL但不太熟悉MATLAB语法的人使用

如果您仍然担心复制大量数据(如我所述,由于延迟复制,情况并非如此),则可以使用以下基于集合的操作获取上面的列
data

[~,index] = ismember(table1.ForeignKey,table2.Key);
data = table2.Data(index);
这里,
data
是一个单元格数组,与表3.data
相同。在任何情况下,这里创建的
索引
值都是SQL在内部为此联接操作创建的值。如果
表1.ForeignKey
不在
表2.Key
中,则相应的
索引
值为0(MATLAB索引从1开始)。在这种情况下,您不能直接使用
索引
进行索引,您需要使用额外级别的索引来仅获取有效行:

[valid,index] = ismember(table1.ForeignKey,table2.Key);
data1 = table1.SomeField(valid)
data2 = table2.Data(index(valid));

请注意,
table/join
以完全相同的方式使用
ismember
,然后复制左表(由于延迟复制,导致副本引用输入表中的数据),并为右表添加列。

Cris,我知道Matlab在向函数传递参数时使用延迟复制,但不是在更新表时。将您的答案概括为整个表不会被复制,但更改的列/变量会被复制,这样做是否准确?@user36800:每列都是一个矩阵,因此如果您更改一个值,则必须复制整个列(如果它是共享的)。另外请注意,
table
是一个
classdef
style对象,您可以检查源代码以验证我在这里所说的内容。我重新阅读了您的解释。这听起来像是需要跟踪原始列数据的引用,以便Matlab知道何时必须复制以响应数据中的更改。在你的第一段中,当你说“直到副本或原件被更改”时,你的意思是“直到副本或原件被更改”?至于深入研究
方法的实现代码,我仍在试图了解
拆分应用
的问题。我通常会尽量避免深入到本地构造的内部,因为我只是迷路了。即使我知道事情是如何运作的,并且是为行为而设计的,我也不能假设它会持续下去,除非它在帮助页面中被正式化。请注意,问题的另一面是文档中经常存在漏洞和错误,文档并不能阻止TMW改变其设计行为。但平心而论,TWM文档是相当不错的。你能举个例子说明你会做什么类型的查询吗