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

Я хочу, чтобы вставить значения в ATT_Table. Теперь в этой таблице есть несколько столбцов, таких как assignedtoID, assignedbyID, envID, ProductID, project_ID, которые являются FK в этой таблице, но первичный ключ в других таблицах - просто цифры).

Теперь, когда я ввод данных от пользователя Я принимаю, что в виде строки, как пользователь вводит Name (Employee_Table), product_Name (Product_table), а не ID непосредственно. Поэтому я хочу, чтобы сначала дать пользователю возможность ввести имя (из Employee или product или Project или Env), а затем значение первичного ключа (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"; 

ответ

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) строки ... Никаких данных не добавлено .. Я думаю, нам нужно иметь эту партию VALUES ... –

2

Способ, которым это обрабатывается, заключается в использовании выпадающих списков выбора. Список состоит из (по крайней мере) двух столбцов: один хранит базу данных Id, и другие (-ы) хранят строки, которые видит пользователь. Как

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

Пользователь видит

CA | Canada 
USA| United States 
... 

значение, которое сохраняется в базе данных 1, 2, ... независимо от строки выбирается пользователем.

Вы никогда не сможете рассчитывать на точный и правильный ввод пользователей. Рано или поздно они сделают опечатку.


Я расширяю свой ответ, исходя из вашего замечания.

Проблема с данным решением (получить идентификатор из родительских таблиц путем совместного использования всех этих родительских таблиц вместе введенным текстом и объединить их с числом И) состоит в том, что как только один заданный параметр имеет опечатку, вы не получите ни одной записи. Представьте себе последствия, когда реальным F_имя сотрудника является «Shant» anu * », и пользователь ввел« Shant »aun *».

Лучший способ справиться с этим - получить эти идентификаторы один за другим из родительских таблиц. Предположим, что некоторые FK имеют ограничение NOT NULL. Вы можете проверить, заполнено ли F_name и сообщить пользователю, когда он не заполнил это поле. Предположим, что пользователь eneterd «Shant» aun * «как имя, программа не будет предупреждать пользователя, поскольку что-то заполнено. Но это не проверка базы данных, потому что ограничения NOT NULL определены на идентификаторе (ФК). Когда вы получаете идентификатор один за другим из родительских таблиц. Вы можете проверить, не являются ли они NOT NULL или нет. Когда текст заполняется, как «Shant * aun *», но возвращенный идентификатор 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

Я знаю, что вы правы .. это предпочтительный способ. Но мне нужно иметь это значение ID в ATT_table .. Разве не возможно, что я спросил? мы можем это сделать ...? –

Смежные вопросы