2014-07-10 4 views
2

그래서 mysql을 사용하여 테이블에 새 열을 삽입하려고한다. 여기 mysql 쿼리에서 둘 이상의 외래 키를 선택하는 방법

내가 시도했습니다 W3 스쿨

INSERT INTO Customers (CustomerName, Country) 
SELECT SupplierName, Country FROM Suppliers 
WHERE Country='Germany'; 

에서 삽입-에 함수의 예입니다 수정이 기본적으로 선택하고 다른 두 테이블에서 특정 정수 값을 삽입하기 위해 조금. 나는 행운이없이 몇 가지 다른 방법을 시도했습니다. 여기 대략하려고하는 것이 있습니다 :

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1) 
SELECT int1 FROM table1 WHERE aString = "something", 
     int2 FROM table2 WHERE bString = "otherthing", 
     0; 

위 코드는 유효한 구문이 아닙니다. 선택을 위해 무엇을 조정해야합니까? 아니면 완전히 다른 것을 시도해야합니까? 고맙습니다.

+0

영어로 원하는 것을 설명하십시오. "기본적으로" "대략적으로"당신이 원하는 것을 마 법적으로 전달하지 않거나 당신이 원하는 것을 말하지 않는 것이 좋습니다. 또한 테이블을 정의하는 SQL을 제공하십시오. 또한 항상 정확한 오류 메시지를 제공하십시오. – philipxy

답변

2

당신은 각이 필요 아래와 같은 하위 선택

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1) 
SELECT (SELECT int1 FROM table1 WHERE aString = 'something'), 
     (SELECT int2 FROM table2 WHERE bString = 'otherthing'), 
     0; 

그러나, 당신은 하위 선택에 의해 반환 된 값을 두 개 이상있는 경우, 그것은 작동하지 않습니다 점에 유의하십시오.

이 사용하는 것이 더 안전 할 것입니다 :

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1) 
SELECT (SELECT int1 FROM table1 WHERE aString = 'something' LIMIT 1), 
     (SELECT int2 FROM table2 WHERE bString = 'otherthing' LIMIT 1), 
     0; 
+0

여러 일치에 대한 좋은 점은 비록 쿼리가 OP가 예상하는 여러 행을 반환하면 설계 수준에서 해결되어야하는 것이라고 말할 수 있습니다. –

3

한 서브 쿼리는 하나의 행 (SQL Fiddle) 반환 당신을 위해 일하는 것이 다음 그들은 하나 개 이상의 행을 반환의 가능성이있는 경우

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1) 
SELECT (SELECT int1 FROM table1 WHERE aString = "something") AS integerVar1, 
     (SELECT int2 FROM table2 WHERE bString = "otherthing") AS integerVar2, 0 

, 당신은 결과를 좁힐한다을 보다 자세한 where 절을 사용하거나 limit 절을 사용합니다.

2

다른 답변이 필요한 값을 검색하는 하위 쿼리를 사용하는 방법을 보여줍니다. 이에 (

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1) 
VALUES 
(
    (SELECT int1 FROM table1 WHERE aString = 'something'), 
    (SELECT int2 FROM table2 WHERE bString = 'otherthing'), 
    0 
); 

하지만 그냥 구문 변화보다 더 아무것도 없을 것이다 : 나는 당신이 각 문자열에 대해 하나의 일치를 기대 [것] 이후, 당신은 또한 INSERT...VALUES 구문 대신 INSERT...SELECT을 사용할 수 있음을 추가 할 수 특별한 경우).

내가 실제로주의를 끌기를 원하는 것은 두 개의 하위 쿼리 각각이 빈 집합을 반환하여 스칼라 NULL로 평가할 수 있다는 것입니다. 참조 중 하나 또는 모두가 NULL이면 여전히 행을 삽입 하시겠습니까? 당신이 이러한 경우에 행을 삽입하는 쿼리를하지 원하는 경우

, 대신이 방법을 고려할 수 :

INSERT INTO table0 (integerVar1, integerVar2, booleanVar1) 
SELECT 
    t1.int1, t2.int2, 0 
FROM 
    (SELECT int1 FROM table1 WHERE aString = 'something') AS t1 
CROSS JOIN 
    (SELECT int2 FROM table2 WHERE bString = 'otherthing') AS t2 
; 

하위 쿼리 중 하나 경우 행을 반환하지 않습니다, 십자가 가입 두 세트 중 하나가 비어 있고 INSERT는 table0에 행을 삽입하지 않습니다.

관련 문제