Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
У меня есть 3 таблицы Employee, Company, Rank
создаем!
CREATE TABLE Employee
(
EmployeeID int NOT NULL IDENTITY,
EmployeeName varchar(30) NOT NULL,
EmployeeAge int NOT NULL,
CompanyID int DEFAULT NULL,
Rank int DEFAULT NULL,
PRIMARY KEY(EmployeeID)
)
GO

CREATE TABLE Company
(
ID int NOT NULL IDENTITY,
CompanyName varchar (30) NOT NULL,
CompanyAdress varchar (30) NOT NULL,
PRIMARY KEY (ID)
)
GO

CREATE TABLE Rank
(
Rank int NOT NULL IDENTITY,
Salary int NOT NULL,
PRIMARY KEY (Rank)
)
GO



Вставляем данные в Employee

INSERT INTO Employee
(EmployeeName, EmployeeAge)
VALUES
('Ivan Petrov', 25),
('Petr Gavrilov', 30),
('Sergey Dobrinin', 28),
('Georgiy Jukov', 32),
('Simonenko Ilya', 22),
('Egorov Dmitriy', 35),
('Ivanov Anton', 29),
('Ponomarev Dmitriy', 33),
('Golubev Alexey', 20),
('Fedorov Mikhail', 24)
GO


Вставляем данные в Company

INSERT INTO Company
VALUES
('Alfa', 'Moscow'),
('Beta', 'London'),
('Gamma', 'NY'),
('Delta', 'Paris'),
('Dron', 'Kashin'),
('Penta', 'Tver'),
('Sibur', 'SanktPiter'),
('Sber', 'Kasan'),
('WTB', 'Kostroma'),
('Prom', 'Pskov')
GO

Вставляем данные в Rank

I
NSERT INTO Rank
VALUES
(500000),
(130000),
(20000),
(55000),
(47000),
(11000),
(29000),
(178000),
(40000),
(30000)
GO


Таблица Employee Главная, через ALTER TABLE делаем CompanyID и Rank в качестве FOREIGN KEY

ALTER TABLE Employee
ADD CONSTRAINT Company_CompanyID_FK
FOREIGN KEY(CompanyID)
REFERENCES Company (ID)
GO

ALTER TABLE Employee
ADD CONSTRAINT Rank_Rank_FK
FOREIGN KEY (Rank)
REFERENCES Rank (Rank)
GO

Сделали, Вопрос, почему ID из Company и Rank не подгрузились в Employee? Или что я не правильно делаю
employeeID EmployeeName   EmployeeAGE        CompanyID     Rank
1	          Ivan Petrov	        25	                    NULL	     NULL
2	          Petr Gavrilov	        30	                    NULL	     NULL
3	          Sergey Dobrinin	28	                    NULL	     NULL
4	          Georgiy Jukov	        32	                    NULL	     NULL
5	          Simonenko Ilya	22	                    NULL          NULL
6	          Egorov Dmitriy	        35	                    NULL	     NULL
7	          Ivanov Anton	        29                        NULL	     NULL
8	          Ponomarev Dmitriy	33	                    NULL	     NULL
9	          Golubev Alexey	20	                    NULL	     NULL
10	          Fedorov Mikhail	24	                    NULL	     NULL


Сообщение было отредактировано: 10 ноя 18, 18:09
10 ноя 18, 16:21    [21730484]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
СОРИ, я все понял, мой ответ - а с чего вдруг бд должна понять какое ID к какому относится, нужно самому вносить значения в companyID и в Rank
10 ноя 18, 16:35    [21730491]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
dermama
СОРИ, я все понял, мой ответ - а с чего вдруг бд должна понять какое ID к какому относится, нужно самому вносить значения в companyID и в Rank
FOREIGN KEY и PRIMARY KEY - это всего лишь ограничения (CONSTRAINTS) на вставляемые, изменяемые и удаляемые записи.
Есть правда, возможность делать каскадные изменения в других таблицах (при UPDATE и DELETE),
но это всё равно надо явно запустить, а не ждать, что всё произойдёт само собой.
10 ноя 18, 19:20    [21730562]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
iap,

Мучаюсь второй час с примером, прошу о помощи в решении.
10 ноя 18, 22:26    [21730662]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
iap,

Мучаюсь второй час с примером, прошу о помощи в решении. Есть 2 таблицы


ID CompanyNAME Company Adress
1 Alfa Moscow
2 Beta London
3 Gamma NY
4 Delta Paris
5 Dron Kashin
6 Penta Tver
7 Sibur SanktPiter
8 Sber Kasan
9 WTB Kostroma
10 Prom Pskov

И
EmployeeID EmployeeNAME EmployeeAge CompanyID Rank
1 Ivan Petrov 25 1 2
2 Petr Gavrilov 30 2 3
3 Sergey Dobrinin 28 5 1
4 Georgiy Jukov 32 1 4
5 Simonenko Ilya 22 6 7
6 Egorov Dmitriy 35 10 8
7 Ivanov Anton 29 9 6
8 Ponomarev Dmitriy 33 3 2
9 Golubev Alexey 20 5 5
10 Fedorov Mikhail 24 4 7


Задание следующее 5. Show Company name that has biggest number of employees
Показать компании у которых самое большое число сотрудников... не могу понять как делать
10 ноя 18, 22:31    [21730667]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
Я сделал вот так, но что то мне подсказывает, что это не верно так как в моих компаниях нет компаний в которых больше чем один сотрудник

SELECT c.CompanyName
FROM Company c
INNER JOIN
Employee e
ON c.ID = e.EmployeeID
WHERE EmployeeName = (SELECT MAX(EmployeeName) FROM Employee)
GO

хотя результат Dron
10 ноя 18, 22:49    [21730685]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
есть еще вот такой вариант, но он подходит лишь тогда, когда я знаю, больше одного уже достаточно!!!


SELECT COUNT(c.CompanyName) as Name
FROM Employee e
INNER JOIN
Company c
ON e.EmployeeID = c.ID
GROUP BY EmployeeID
HAVING COUNT(c.CompanyName)>1
GO
10 ноя 18, 22:54    [21730693]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
dermama
Задание следующее 5. Show Company name that has biggest number of employees
Показать компании у которых самое большое число сотрудников... не могу понять как делать
Не "компании", а "компанию", одну.
SELECT top 1 c.CompanyName, COUNT(*) as cnt
FROM Company c
  INNER JOIN Employee e
  ON c.ID = e.CompanyID
GROUP BY c.CompanyName
ORDER BY cnt DESC
10 ноя 18, 23:41    [21730710]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
alexeyvg, спасибо.
10 ноя 18, 23:52    [21730715]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
dermama
Member

Откуда:
Сообщений: 226
alexeyvg,

Я единственное не могу понять, как база данных определяет, что нужно считать именно количество сотрудников в компания, ведь никаких условий для этого нету, есть только вывести ТОП 1 компаний и функция COUNT, а что эта функция считает именно количество сотрудников, как понять*?
11 ноя 18, 00:04    [21730722]     Ответить | Цитировать Сообщить модератору
 Re: Первичный вторичный ключи  [new]
PizzaPizza
Member

Откуда:
Сообщений: 367
dermama,

GROUP BY c.CompanyName


Вы соединяете каждого сотрудника с его компанией, потом группируете по компании и агрегатная функция count считает по условию группировки - по количеству сотрудников в компании.

Посмотрите на результат без подсчёта для наглядности:

SELECT  *
FROM Company c
  INNER JOIN Employee e
  ON c.ID = e.CompanyID


Почитайте про агрегатные функции, без них никуда в sql
11 ноя 18, 00:23    [21730734]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить