Есть таблица с данными по машинами. Скрипт создания:
CREATE TABLE [Car]
(
[id] [int] IDENTITY(1,1) NOT NULL,
[mark] [char](32) NOT NULL,
[model] [nchar](32) NOT NULL,
[serial] [numeric](10, 0) NOT NULL,
[year] [numeric](4, 0) NOT NULL,
[some] [nchar](10) NOT NULL,
)
Содержимое:
id mark model serial year some
1 Aston Martin DB9 9034524418 2005 thhhrtyum
2 Hyundai Coupe 4567678393 2004 xiang
3 Chrysler 300C 1746684332 2008 xvsasg
4 Aston Martin DB9 9034524418 2006 oiueuhd
5 Chrysler 300C 1546678890 2004 wrthsd
6 Aston Martin DB9 9034535321 2007 plerojcn
7 Nissan 350Z 4567678393 2005 fbnvxr
8 Chrysler Sebring 1546678890 2005 adfbvnv
9 Hyundai Coupe 4567678393 2008 swang
10 Aston Martin DB9 9034524418 2009 hurrand
Принято, что строка является уникальной, если ее комбинация полей model и serial не встречается ни в одной другой строке. Нужно составить запрос, который вернет все уникальные в этом смысле строки таблицы. В этом состоит задание.
Вот решение (запорос):
SELECT C.id, C.mark, C.model, C.serial, C.year, C.[some]
FROM Car AS C
INNER JOIN
(
SELECT
[model]
,serial
, COUNT(*) AS CNT
FROM [Car]
GROUP BY [model], serial
) AS TCNT
ON C.model=TCNT.model AND C.serial=TCNT.serial AND TCNT.CNT = 1
А вот, что вернет этот запрос:
5 Chrysler 300C 1546678890 2004 wrthsd
3 Chrysler 300C 1746684332 2008 xvsasg
7 Nissan 350Z 4567678393 2005 fbnvxr
6 Aston Martin DB9 9034535321 2007 plerojcn
8 Chrysler Sebring 1546678890 2005 adfbvnv
По мотивам предыдущего поста:
Это задание было на собеседовании у одного из моих знакомых. На листочке написано содержимое двух таблиц (Т1 и Т2) и несколько запросов. Нужно написать (тоже на бумажке), что вернут эти запросы.
Таблицы:
T1:
Id Value
1 STR11
2 STR12
3 STR13
T2:
Id Value
1 STR21
3 STR23
4 STR24
Запросы:
1. SELECT * FROM [T1] LEFT JOIN [T2] ON T1.Id = T2.Id
2. SELECT * FROM [T1] RIGHT JOIN [T2] ON T1.Id = T2.Id
3. SELECT * FROM [T1] INNER JOIN [T2] ON T1.Id = T2.Id
4. SELECT * FROM [T1] FULL JOIN [T2] ON T1.Id = T2.Id
5. SELECT * FROM [T1] LEFT JOIN [T2] ON T1.Id = T2.Id AND T2.Id > 1
6. SELECT * FROM [T1] LEFT JOIN [T2] ON T1.Id = T2.Id WHERE T2.Id > 1
7. SELECT * FROM [T1] WHERE T1.Id IN (SELECT Id FROM T2)
8. SELECT * FROM [T1] WHERE T1.Id = (SELECT Id FROM T2)
А теперь запросы с ответами (тем, что вернул SQL Server, проверялось в Management Studio):
1. SELECT * FROM [T1] LEFT JOIN [T2] ON T1.Id = T2.Id
Id Value Id Value
1 STR11 1 STR21
2 STR12 NULL NULL
3 STR13 3 STR23
2. SELECT * FROM [T1] RIGHT JOIN [T2] ON T1.Id = T2.Id
Id Value Id Value
1 STR11 1 STR21
3 STR13 3 STR23
NULL NULL 4 STR24
3. SELECT * FROM [T1] INNER JOIN [T2] ON T1.Id = T2.Id
Id Value Id Value
1 STR11 1 STR21
3 STR13 3 STR23
4. SELECT * FROM [T1] FULL JOIN [T2] ON T1.Id = T2.Id
Id Value Id Value
1 STR11 1 STR21
2 STR12 NULL NULL
3 STR13 3 STR23
NULL NULL 4 STR24
5. SELECT * FROM [T1] LEFT JOIN [T2] ON T1.Id = T2.Id AND T2.Id > 1
1 STR11 NULL NULL
2 STR12 NULL NULL
3 STR13 3 STR23
6. SELECT * FROM [T1] LEFT JOIN [T2] ON T1.Id = T2.Id WHERE T2.Id > 1
Id Value Id Value
3 STR13 3 STR23
7. SELECT * FROM [T1] WHERE T1.Id IN (SELECT Id FROM T2)
1 STR11
3 STR13
8. SELECT * FROM [T1] WHERE T1.Id = (SELECT Id FROM T2)
Msg 512, Level 16, State 1, Line 23
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.