在表中插入从其他表中选择的一些值

时间:2012-04-09 10:16:43

标签: sql database

我的数据库结构如下::

数据库结构::

  • 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
  • Employee_Product_projectMapping_Table -Emp_ID(FK), Project_ID(FK), Product_ID(FK)
  • Product_EnvMapping_Table - Product_ID(FK), Env_ID(FK)

我想在ATT_Table中插入值。现在在该表中,我有一些列,例如assignedtoIDassignedbyIDenvIDProductIDproject_ID,这些列在此表中为FK,但在其他表中为主键他们只是数字)。

现在,当我从用户输入数据时,我会以字符串的形式输入数据,例如用户输入NameEmployee_Table),product_NameProduct_table)和不是ID直接。所以我想先让用户输入名称(EmployeeproductProjectEnv),然后输入其主键值Emp_ID, product_ID, project_ID, Env_ID拾取然后将它们插入ATT_table代替assignedtoID, assignedbyID, envID, ProductID, project_ID

请注意,assignedtoID, assignedbyID引用了Emp_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";  

2 个答案:

答案 0 :(得分:2)

处理方法是使用下拉选择列表。该列表包含(至少)两列:一列保存Id的数据库,另一列保存用户看到的字符串。喜欢

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

用户看到

CA | Canada
USA| United States  
...

存储在数据库中的值是1,2,...用户选择的任何行。

您永远不能依赖用户的准确,正确的输入。他们迟早会犯错误。


我根据你的评论扩展我的答案。

给定解决方案的问题(通过输入的文本将所有这些父表连接在一起并通过将多个AND组合在一起来从父表中获取Id)是一旦给定参数有拼写错误,将不会记录回来。想象一下当员工的真实F_name是“Shant * anu * ”并且用户输入“Shant * aun * ”时的后果。

解决这个问题的最佳方法是从父表中逐个获取这些Id。假设一些FK具有NOT NULL约束。您可以检查F_name是否已填写,并在用户未填写该字段时通知用户。假设用户输入“Shant * aun * ”作为名称,程序将不会警告用户,因为填写了某些内容。但这不是数据库将要执行的检查,因为NOT NULL约束在Id(FK)上定义。当您从父表中逐个获取Id时。您可以验证它们是否为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"

答案 1 :(得分:1)

请使用 AND 代替 OR

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";

但我认为最好在您的方案中使用下拉列表。