2012-04-09 4 views
0

에서 선택되는 일부 값은 나는이 ::삽입 다른 테이블

데이터베이스 구조 ::

  • ATT_table- ActID(PK), assignedtoID(FK), assignedbyID(FK), Env_ID(FK), Product_ID(FK), project_ID(FK), Status
  • Product_table - Product_ID(PK), Product_name
  • Project_Table- Project_ID(PK), Project_Name
  • Environment_Table- Env_ID(PK), Env_Name처럼 내 데이터베이스 구조를 가지고
  • Employee_Table- Employee_ID(PK), Name 내가 ATT_Table에 값을 삽입 할
  • Product_EnvMapping_Table - Product_ID(FK), Env_ID(FK)

  • Employee_Product_projectMapping_Table -Emp_ID(FK), Project_ID(FK), Product_ID(FK)
  • . 이제이 테이블에서 assignedtoID, assignedbyID, envID, ProductID, project_ID과 같은 일부 열이 있지만이 테이블에서는 FK이지만 다른 테이블의 기본 키는 숫자입니다. I는 사용자로부터 데이터를 입력하고있는 경우에는, 유저가 Name ( Employee_Table)에 입사 같이

    는 이제 product_Name (Product_table)가 아니라 직접 ID, 문자열의 형태로 그 복용하고있다. 그래서 선택됩니다 먼저 사용자가 (Employee 또는 product 또는 Project 또는 Env의) 이름과 기본 키 (Emp_ID, product_ID, project_ID, Env_ID)의 다음 값을 입력 할 수 있도록 할 그리고 그들은 assignedtoID, assignedbyID, envID, ProductID, project_ID 대신 ATT_table에 삽입됩니다.

    assignedtoID, assignedbyIDEmp_ID에서 Employee_Table으로 참조됩니다.

    어떻게 하시겠습니까? 내가 이런 걸 가지고 있지만 작동하지 않습니다 :

    INSERT INTO ATT_TABLE(Assigned_To_ID,Assigned_By_ID,Env_ID,Product_ID,Project_ID) 
    VALUES (A, B, Env_Table.Env_ID, Product_Table.Product_ID, Project_Table.Project_ID) 
    SELECT Employee_Table.Emp_ID AS A,Employee_Table.Emp_ID AS B, Env_Table.Env_ID, Project_Table.Project_ID, Product_Table.Product_ID 
    FROM Employee_Table, Env_Table, Product_Table, Project_Table 
    WHERE Employee_Table.F_Name= "Shantanu" or Employee_Table.F_Name= "Kapil" or Env_Table.Env_Name= "SAT11A" or Product_Table.Product_Name = "ABC" or Project_Table.Project_Name = "Project1"; 
    

    답변

    1

    대신 또는을 사용하십시오.

    INSERT INTO ATT_TABLE(Assigned_To_ID,Assigned_By_ID,Env_ID,Product_ID,Project_ID) 
        SELECT A.Emp_ID, B.Emp_ID, Env_Table.Env_ID, Project_Table.Project_ID, Product_Table.Product_ID 
        FROM Employee_Table A, Employee_Table B, Env_Table, Product_Table, Project_Table 
        WHERE A.F_Name= "Shantanu" 
         AND B.F_Name= "Kapil" 
         AND Env_Table.Env_Name= "SAT11A" 
         AND Product_Table.Product_Name = "ABC" 
         AND Project_Table.Project_Name = "Project1"; 
    

    하지만 시나리오에서 드롭 다운 목록을 사용하는 것이 가장 좋습니다.

    +0

    오류 삽입을 계속합니다; SQL 문의 끝에. 나는 그 값을 삽입하는 끝을 취하는 것 같아요. 값을 삽입 한 후; 그것을 실행하십시오. 그것은 나에게 오류 텍스트를 찾았습니다. 그것은 명백합니다. 이전에도 나는 똑같은 것을 얻고있다. SELECT 문까지 가지 않습니다. 고마워. –

    +0

    내 코드를 업데이트했습니다. 지금보십시오. – sarwar026

    +0

    나를 줘 ... (0) 개의 행을 추가하려고합니다 ... 데이터가 추가되지 않습니다 .. 우리가 그 부분을 가질 필요가 있다고 생각합니다 ... –

    2

    이 방법은 처리하는 방식은 드롭 다운 선택 목록을 사용하는 것입니다. 목록은 최소한 두 개의 열로 구성됩니다. 하나는 ID의 데이터베이스가 사용되고 다른 하나는 사용자가 보는 문자열을 저장하는 열입니다.

    1, "CA", "Canada" 
    2, "USA", 'United States" 
    ... 
    

    마찬가지로 사용자는

    CA | Canada 
    USA| United States 
    ... 
    

    데이터베이스에 1, 2, ..., 사용자가 선택하신 행입니다 저장됩니다 값을 본다.

    사용자의 정확한 입력에 의존해서는 안됩니다. 조만간 오타가 생길 것입니다.


    귀하의 발언에 따라 답변을 연장합니다.

    입력 된 텍스트로 모든 부모 테이블을 함께 조인하여 부모 테이블에서 ID를 가져 와서 여러 AND 테이블과 결합하면 문제가 발생합니다. 한 매개 변수에 오타가 있으면, 당신은 하나의 기록을 되 찾을 수 없습니다. 직원의 실제 F_name이 "Shant * anu *"이고 사용자가 "Shant * aun *"을 입력 한 경우의 결과를 상상해보십시오.

    이 문제를 극복하는 가장 좋은 방법은 부모 테이블에서 해당 ID를 하나씩 가져 오는 것입니다. 일부 FK에 NOT NULL 제약 조건이 있다고 가정합니다. F_name이 채워 졌는지 확인하고 사용자가 필드를 채우지 않았을 때이를 사용자에게 알릴 수 있습니다. 사용자가 "Shant * aun *"이라는 이름을 정한 경우, 프로그램은 사용자에게 경고 메시지를 표시하지 않습니다. 그러나 NOT NULL 제약 조건은 ID에 정의되어 있으므로 데이터베이스에서 수행 할 검사는 아닙니다. (FK). 부모 테이블에서 이드를 하나씩 가져올 때. NULL이 아닌지 확인할 수 있습니다. "Shant * aun *"과 같이 텍스트가 채워지지만 반환 된 ID가 NULL이면 사용자에게 문제를 알리고 입력 내용을 수정할 수 있습니다. "Shantaun이라는 이름의 직원이 없습니다. 녹이다."

    SELECT $Emp_ID_A = Emp_ID 
    FROM Employee_Table 
    WHERE F_Name= "Shantanu" 
    
    SELECT $Emp_ID_B = Emp_ID 
    FROM Employee_Table 
    WHERE B.F_Name= "Kapil" 
    
    SELECT $Env_ID = Env_ID 
    FROM Env_Table 
    WHERE Env_Table.Env_Name= "SAT11A" 
    
    SELECT $Product_ID = Product_ID 
    FROM Product_Table 
    WHERE Product_Table.Product_Name = "ABC" 
    
    SELECT $Project_ID = Project_ID 
    FROM Project_Table 
    WHERE Project_Name = "Project1" 
    
    +0

    나는 당신이 맞다는 것을 알고있다. 그것은 바람직한 방법이다.하지만 나는 ATT_table에 그 ID 값을 가져야한다. 내가 무엇을 요청 했는가 가능하지 않은가? 우리가 그걸 할 수 있을까? –

    관련 문제