说我有表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匹配的所有相应行,我得到了每个组合。
答案 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.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;
:
T1
如果这会产生重复项,那么name
为给定的sequenceNumber
提供了多行。