Я использую SQL Server 2014, и у меня возникла проблема с запросом. У меня три стола. Report
состоит из десяти ClothingObservation
и HygieneObservation
. Я делаю это, ссылаясь на ReportId
из Report
в десяти строках каждого из двух типов наблюдений, всего 20 наблюдений на отчет. Я хочу выбрать все строки одного отчета. Когда я пытаюсь это сделать, я получаю 100 строк. Моя цель — получить 10 строк или 20 строк со значениями NULL
. На данный момент это сделано для тестирования, поэтому Report
содержит только 1 строку, а ClothingObservation
и HygieneObservation
содержат по 10 строк каждая, и все они ссылаются на ReportId
одного существующего отчета.
Мои таблицы, детали опущены для ясности:
CREATE TABLE HygieneObservation
(
HygieneObservationId int PRIMARY KEY IDENTITY NOT NULL,
...
ReportId int NOT NULL
)
CREATE TABLE ClothingObservation
(
ClothingObservationId int PRIMARY KEY IDENTITY NOT NULL,
...
ReportId int NOT NULL
)
CREATE TABLE Report
(
ReportId int PRIMARY KEY IDENTITY NOT NULL,
Period Date NOT NULL,
Reporter nvarchar(8) NOT NULL,
DepartmentId int NOT NULL
)
Мой запрос:
SELECT
Report.ReportId,
Report.Period,
Report.Reporter,
Report.DepartmentId,
ClothingObservation.ClothingObservationId,
HygieneObservation.HygieneObservationId
FROM Report
LEFT JOIN ClothingObservation ON
(ClothingObservation.ReportId = Report.ReportId)
LEFT JOIN HygieneObservation ON
(HygieneObservation.ReportId = Report.ReportId)
GROUP BY
Report.ReportId,
Period,
Reporter,
DepartmentId,
ClothingObservation.ClothingObservationId,
HygieneObservation.HygieneObservationId
Это дает мне 100 строк, как я понимаю, потому что каждая строка в ClothingObservation
соответствует каждой строке в HygieneObservation
. Я думал, что использование GROUP BY
приведет к удалению дубликатов, но я явно делаю что-то не так. Любые подсказки?
Изменить: вот мои данные прямо сейчас (детали опущены).
Report:
ReportId Period Reporter DepartmentId
----------- ---------- -------- ------------
1 2016-05-01 username 1
ClothingObservation:
ClothingObservationId ... ReportId
--------------------- ... -----------
1 ... 1
2 ... 1
3 ... 1
4 ... 1
5 ... 1
6 ... 1
7 ... 1
8 ... 1
9 ... 1
10 ... 1
HygieneObservation:
HygieneObservationId ... ReportId
-------------------- ... -----------
3 ... 1
4 ... 1
5 ... 1
6 ... 1
7 ... 1
8 ... 1
9 ... 1
10 ... 1
12 ... 1
13 ... 1
Редактировать 2: если я запускаю эти два запроса, я получаю желаемый результат (опять же, нерелевантные детали опущены из результата):
SELECT * FROM Report
LEFT JOIN ClothingObservation ON
(ClothingObservation.ReportId = Report.ReportId)
SELECT * FROM Report
LEFT JOIN HygieneObservation ON
(HygieneObservation.ReportId = Report.ReportId)
ReportId Period Reporter DepartmentId ClothingObservationId ... ReportId
----------- ---------- -------- ------------ --------------------- ...- -----------
1 2016-05-01 username 1 1 ... 1
1 2016-05-01 username 1 2 ... 1
1 2016-05-01 username 1 3 ... 1
1 2016-05-01 username 1 4 ... 1
1 2016-05-01 username 1 5 ... 1
1 2016-05-01 username 1 6 ... 1
1 2016-05-01 username 1 7 ... 1
1 2016-05-01 username 1 8 ... 1
1 2016-05-01 username 1 9 ... 1
1 2016-05-01 username 1 10 ... 1
ReportId Period Reporter DepartmentId HygieneObservationId ... ReportId
----------- ---------- -------- ------------ -------------------- ... -----------
1 2016-05-01 username 1 3 ... 1
1 2016-05-01 username 1 4 ... 1
1 2016-05-01 username 1 5 ... 1
1 2016-05-01 username 1 6 ... 1
1 2016-05-01 username 1 7 ... 1
1 2016-05-01 username 1 8 ... 1
1 2016-05-01 username 1 9 ... 1
1 2016-05-01 username 1 10 ... 1
1 2016-05-01 username 1 12 ... 1
1 2016-05-01 username 1 13 ... 1
Моя цель — получить этот вывод (или что-то подобное) с помощью одного запроса.
NULL
, где нет данных для отображения. Если это имеет смысл? - person Tobbe   schedule 13.06.2016