表连接后,需要基于具有相同ID的另一行的特定行值

时间:2016-02-22 19:15:11

标签: sql

我有两张表如下:

表1:

ID  FName
1   Basics
2   Machine1
3   master
4   Machine2
15  Machine3
16  Machine16

表2:

ParentID    Name            InitialValue
1       Active          1
2       MachineName     Entrylevel
2       Active          1
3       Active          1
4       MachineName     Midlevellevel
4       Active          1
15      MachineName     Endlevel
15      Active          1
16      MachineName     Miscellenious
16      Active          0

这里,表1的ID在表2中称为父ID。我想要"初始值"表2中的MachineName行(表2)提供了" InitialValue"表2中活性行(表2)的结果为1

结果应该是

ID  InitialValue
2   Entrylevel
4   Midlevellevel
15  Endlevel

3 个答案:

答案 0 :(得分:1)

您可以连接第二个表两次,一次用于MachineName,一次用于Active:

SELECT     t.ID, machine.InitialValue
FROM       table1 t 
INNER JOIN table2 machine 
        ON t.ID = machine.ParentId
       AND machine.Name = 'MachineName'
INNER JOIN table2 active 
        ON t.ID = active.ParentId
       AND active.Name = 'Active'
       AND active.InitialValue = 1;

关于加入

JOIN语法允许您将记录链接到FROM列表中的上一个表,大多数情况下通过外键关系 - 主键。在遥远的过去,我们过去常常使用WHERE条件,但这确实是过时的语法。

在上面的查询中,主键 - 外键的关系在第一种情况下用t.ID = machine.ParentId表示。请注意为table2定义的别名,因此我们可以使用machine来引用它。

在连接条件中添加了一些额外条件,例如machine.Name = 'MachineName'。那些也可以放在WHERE条款中,但我喜欢这样。

然后再次连接同一个表,这次使用另一个别名。这次它过滤了" Active" 1条记录。请注意,如果table1中的 ID 没有与这些条件匹配的记录,则该父记录将从结果中排除。

所以现在我们有table1记录,匹配​​" MachineName"记录并确定有一个" Active"它也有1条记录。这是需要输出的内容。

答案 1 :(得分:0)

SELECT t1.ID, t2.InitialValue
FROM table1 t1 join table2 t2 on t1.ID=t2.ParentID
WHERE t2.name LIKE 'MachineName'AND t1.ID= ANY(SELECT t22.ParentID
                                                  FROM table2 t22
                                                  WHERE t22.InitialValue=1)

我认为这应该有用

//稍微更改了WHERE clausule中的条件(t2.parentID更改为t1.ID)

答案 2 :(得分:0)

不确定这是否是标准SQL,但它应该可以使用MySQL。

SqlBulkCopy
相关问题