Я новичок в SQL Server и создал три таблицы students, phones и stud_phone.

Соотношение между student и phone много-много, таблица stud_phone содержит два внешних ключа из таблиц student и phone.

Чего я хочу добиться, так это того, что я хочу получить данные о студенте Id1 и соответствующих им телефонах, которые у него есть, но я не могу этого сделать.

Я получаю такую ​​ошибку:

составной идентификатор не может быть связан

Вот моя схема:

enter image description here

Вот мой запрос:

select * 
from student, phone
join stud_phone on student.stId = 1
                and student.stId = stud_phone.stId
                and phone.phId = stud_phone.phId
0
Inam 20 Авг 2018 в 22:38

4 ответа

Лучший ответ

Вы, наверное, имеете в виду:

select * 
from student, phone
join stud_phone on student.stId = 1
                and student.stId = stud_phone.stId
                and phone.phId = stud_phone.phId

Замените '_' в student_Id на '.': Student.stId

1
marc_s 20 Авг 2018 в 20:58

Приведенный ниже запрос должен вернуть студентов с их номерами телефонов. Я использовал псевдонимы таблиц и синтаксис соединения ANSI-92

select s.*, p.* 
from student as s
join stud_phone as sp on s.stId = sp.stId
inner join phone as p on p.phId = sp.phId
where s.stId = 1

Обновить : если отношение между student и stud_phone равно нулю для многих, то вам следует использовать LEFT JOIN между student и stud_phone таблицами.

2
Vinit 20 Авг 2018 в 20:10
select * 
from student s
left join stud_phone sp on s.stId=sp.stId
inner join phone p on p.phId = sp.phId
where s.stId = 1;

Здесь s, sp и p являются «локальными псевдонимами» и просто используются с целью меньшего набора текста (это имеет полезные преимущества в других местах). Обратите внимание, что при использовании объединений старого стиля возникают проблемы, это неявно создает внутреннее объединение (но у ученика может быть 0 телефонов).

3
Cetin Basoz 20 Авг 2018 в 19:53

Возможно, это то, что вы имели в виду:

SELECT s.*, sp.*
FROM student s
INNER JOIN stud_phone sp ON sp.stId = s.stId
INNER JOIN phone p ON p.phId = s.phId

ПРИМЕЧАНИЕ. Вам действительно следует подумать о переходе на более разумный стиль соединений. ANSI-92 теперь достаточно взрослый, чтобы пить. ; )

2
Jiggles32 20 Авг 2018 в 19:53
51937480