powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу сделать правильный запрос
7 сообщений из 7, страница 1 из 1
Не могу сделать правильный запрос
    #32057047
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Связь многие-ко-многим между таблицами Client и ClientGroup организована с помощью таблицы ClientInGroup, в ней хранится инф-ия о вхождении клиента в группу клиентов.
В форме группы клиента встала задача выбрать список клиентов, так, чтобы в нем отобразились, только те клиенты, которые еще не относятся к данной группе.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT
	[Client_ID],
	[Client_Name]
FROM
	[Client]

		LEFT JOIN
	[ClientInGroup]
		ON
	[ClientInGroup_Client_ID] = [Client_ID]

		INNER JOIN
	[ClientGroup]
		ON
	[ClientGroup_ID] = [ClientInGroup_ClientGroup_ID]
		AND
	[ClientInGroup_Client_ID] IS NULL

WHERE
	[ClientGroup_ID] = @ClientGroup_ID


Вроде что-то этого, но LEFT JOIN не берет из таблицы Client оставшиеся записи. Конечно, это можно легко реализовать с подзапросом, но хотелось бы обойтись чистым джойном.
...
Рейтинг: 0 / 0
Не могу сделать правильный запрос
    #32057054
Александр Спелицин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SELECT Client_ID, Client_Name
FROM Client LEFT JOIN ClientInGroup ON ClientInGroup_Client_ID = Client_ID
WHERE ClientGroup_ID = @ClientGroup_ID
and ClientInGroup_Client_ID IS NULL

В MsAccess есть мастер запроса "Поиск записей в главной таблице, не имеющих подчиненных (записей)". Постройте такой запрос и посмотрите на его код.
...
Рейтинг: 0 / 0
Не могу сделать правильный запрос
    #32057055
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT
	[Client_ID],
	[Client_Name]
FROM
	[Client]
           LEFT JOIN [ClientInGroup] ON [ClientInGroup_Client_ID] = [Client_ID]
           INNER JOIN [ClientGroup] ON [ClientGroup_ID] =[ClientInGroup_ClientGroup_ID]
                     AND [ClientGroup_ID] = @ClientGroup_ID

WHERE
	[ClientInGroup_Client_ID] IS NULL
...
Рейтинг: 0 / 0
Не могу сделать правильный запрос
    #32057060
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Оба варианта без предиката выдают токо тех клиентов, которые уже в группе, а с предикатом вообще ни одной записи. Я прихожу к выводу, что при множественных джойнах, LEFT работает как INNER.
...
Рейтинг: 0 / 0
Не могу сделать правильный запрос
    #32057061
dkstranger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
select * from client where
not Client_Id in (select ClientInGroup_Client_ID
from ClientInGroup where
ClientGroup_ID = @ClientGroup_ID)
...
Рейтинг: 0 / 0
Не могу сделать правильный запрос
    #32057070
Фотография Александр Степанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
create table Client
(
	Client_ID int identity( 1 , 1 ) not null primary key clustered,
	Client_Name nvarchar( 100 ) not null
)

create table ClientGroup
(
	ClientGroup_ID int identity( 1 , 1 ) not null primary key clustered,
	ClientGroup_Name nvarchar( 100 ) not null
)

create table ClientInGroup
(
	ClientInGroup_ID int identity( 1 , 1 ) not null primary key clustered,
	ClientInGroup_Client_ID int not null references Client(Client_ID),
	ClientInGroup_ClientGroup_ID int not null references ClientGroup(ClientGroup_ID),
)

create index IX_CIG_C on ClientInGroup(ClientInGroup_Client_ID)
create index IX_CIG_CG on ClientInGroup(ClientInGroup_ClientGroup_ID)
GO

insert into Client (Client_Name) values('Client01')
insert into Client (Client_Name) values('Client02')
insert into Client (Client_Name) values('Client03')

insert into ClientGroup (ClientGroup_Name) values ('Group01')
insert into ClientGroup (ClientGroup_Name) values ('Group02')
insert into ClientGroup (ClientGroup_Name) values ('Group03')

insert into ClientInGroup(ClientInGroup_Client_ID,ClientInGroup_ClientGroup_ID) values ( 1 , 1 )
insert into ClientInGroup(ClientInGroup_Client_ID,ClientInGroup_ClientGroup_ID) values ( 1 , 3 )

insert into ClientInGroup(ClientInGroup_Client_ID,ClientInGroup_ClientGroup_ID) values ( 2 , 2 )
insert into ClientInGroup(ClientInGroup_Client_ID,ClientInGroup_ClientGroup_ID) values ( 2 , 3 )

insert into ClientInGroup(ClientInGroup_Client_ID,ClientInGroup_ClientGroup_ID) values ( 3 , 2 )
GO

DECLARE @ClientGroup_ID int
Set @ClientGroup_ID= 3 

SELECT
	Client_ID,
	Client_Name
From
	Client
	inner join ClientGroup
		on ClientGroup_ID=@ClientGroup_ID
	left join ClientInGroup
		on ClientInGroup_Client_ID=Client_ID
		AND ClientInGroup_ClientGroup_ID=ClientGroup_ID
WHERE
	ClientInGroup_Client_ID Is NULL
	AND ClientInGroup_ClientGroup_ID IS NULL

drop table ClientInGroup
drop table ClientGroup
drop table Client


Это то, что надо?
...
Рейтинг: 0 / 0
Не могу сделать правильный запрос
    #32057077
kreek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Александр Степанов - да этот запрос возвращает правильный набор

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
	[Client_ID],
	[Client_Name]
FROM
	[Client]

		LEFT JOIN
	[ClientInGroup]
		ON
	[ClientInGroup_Client_ID] = [Client_ID]
		AND
	[ClientInGroup_ClientGroup_ID] = @ClientGroup_ID

WHERE
	[ClientInGroup_Client_ID] IS NULL


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SELECT
	[Client_ID],
	[Client_Name]
FROM
	[Client]

		LEFT JOIN
	[ClientInGroup]
		ON
	[ClientInGroup_Client_ID] = [Client_ID]

WHERE
	[ClientInGroup_Client_ID] IS NULL
		AND
	[ClientInGroup_ClientGroup_ID] = @ClientGroup_ID


совсем не одно и тоже оказывается, ведь сначала выполняется джоин а потом на него накладывается условие, вот так вот.
...
Рейтинг: 0 / 0
7 сообщений из 7, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Не могу сделать правильный запрос
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]