繁体   English   中英

Access SQL:如果ID在另一个表中,则从表中选择

[英]Access SQL: Select from table if ID is in another

假设我有表T1:

ID | PNo | MM   | CP | Flag | Name |
---|-----|------|----|------|------|
1  | 13  | True | 4  |  A   |  X   |
1  | 92  | True | 3  |  A   |  X   |
2  | 1   | True | 3  |  B   |  Y   |
2  | 13  | False| 2  |  A   |  Y   |
3  | 13  | True | 3  |  B   |  W   |
4  | 1   | True | 3  |  B   |  Z   |

和T2:

ID | PNo | MM   | CP |
---|-----|------|----|
1  | 13  | True | 4  |
2  | 92  | True | 3  |
3  | 1   | True | 3  |
4  | 13  | False| 2  |
5  | 13  | True | 3  |
1  | 1   | False| 3  |

我想要做的是做一个INSERT INTO,其中我接受T1和T2的值,但前提是T2的ID在T1中并且T1的标志带有值A。

我尝试了两件事:

1)INNER JOIN:类似

INSERT INTO T3 (ID, PNo, MM, CP, Flag, Name)
SELECT T1.ID, T2.PNo, T2.MM, T2.CP, 'A', T1.Name 
FROM T2 INNER JOIN T1 ON T1.ID = T2.ID 
WHERE (T1.FLAG = 'A')

这里的问题是,它实际上会吸收T1和T2中所有相关行的每种组合。 我想要的是,我只想获取ID也在T1中的那些T2行。

2)在?

INSERT INTO T3 (ID, PNo, MM, CP, Flag, Name)
SELECT T1.ID, T2.PNo, T2.MM, T2.CP, 'A', T1.Name
FROM T2, T1 
WHERE T2.ID IN 
      (SELECT ID FROM T1 WHERE Flag = 'X')

问题出在这里,这需要foreeeeeeeeeeeever!

没有更复杂的方法了吗?

edit://更改了T2中的值,以使该示例更有意义。

所以我想要在新表T3中是:

ID | PNo | MM   | CP | Flag | Name |
---|-----|------|----|------|------|
1  | 13  | True | 4  |  A   |  X   |
1  | 1   | False| 3  |  A   |  X   |
2  | 1   | True | 3  |  A   |  Y   |

我得到的是:

ID | PNo | MM   | CP | Flag | Name |
---|-----|------|----|------|------|
1  | 13  | True | 4  |  A   |  X   |
1  | 1   | False| 3  |  A   |  X   |
1  | 13  | True | 4  |  A   |  X   |
1  | 1   | False| 3  |  A   |  X   |
2  | 1   | True | 3  |  A   |  Y   |

因此,基本上,对于我选择的所有T1值(ID,名称)以及可以在T2中通过ID匹配的所有对应行,我都会得到每种组合。

您的第二个解决方案几乎是正确的,但是,您不必要地执行笛卡尔积(我并不惊讶它会永远存在)。 尝试此操作,如果速度较慢,则在Flag上创建一个索引。

INSERT INTO T3 (ID, PNo, MM, CP, Flag, Name)
SELECT *
FROM T2 
WHERE T2.ID IN 
  (SELECT ID FROM T1 WHERE Flag = 'X')

这应该做您想要的:

INSERT INTO T3 (ID, PNo, MM, CP, Flag, Name)
    SELECT T2.ID, T2.PNo, T2.MM, T2.CP, ?, "A"
    FROM T2
    WHERE T2.ID IN (SELECT ID FROM T1 WHERE Flag = "A");

您在第一个查询中选择T1.ID 您可以采用T1.IDT2.ID ,因为您要求它们相等。

您可以使用JOIN做到这一点:

INSERT INTO T3 (ID, PNo, MM, CP, Flag, Name)
    SELECT T2.ID, T2.PNo, T2.MM, T2.CP, T1.Name, "A"
    FROM T2 INNER JOIN
         T1
         ON T2.ID = T1.ID;

如果这会产生重复,则对于给定的name ,您在T1有多行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM