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

时间:2017-09-26 09:02:01

标签: sql ms-access

说我有表T1:

private boolean isDouble(String number){
    try{
        Double.parseDouble(number);
        return true;
    }Catch(Exception e){
        return false;
    }
}

和T2:

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   |

我想做的是执行INSERT INTO,其中我获取T1和T2的值,但仅当T2的ID在T1中并且T1具有值为A的标志时。

我尝试了两件事:

1)INNER JOIN:像

这样的东西
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  |

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

2)IN?

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')

这里的问题是,无论如何都需要这样做!

对此没有更复杂的方法吗?

edit://在T2中更改了一个值,以便示例更有意义。

所以我想要的新表T3是:

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')

我得到的是:

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

所以基本上对于我选择的所有T1值(ID,Name)以及我可以通过T2中的ID匹配的所有相应行,我得到了每个组合。

2 个答案:

答案 0 :(得分:1)

你的第二个解决方案几乎是正确的,然而,你不必要地执行笛卡尔产品(我并不感到惊讶,它需要永远)。试试这个,如果它很慢,那么在Flag上创建一个索引。

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

答案 1 :(得分:0)

这应该做你想要的:

T1.ID

您在第一个查询中选择了T1.ID。您可以选择T2.IDJOIN,因为您要求他们是平等的。

您可以使用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;

执行此操作
T1

如果这会产生重复项,那么name为给定的sequenceNumber提供了多行。