Сбор информации с использованием таблицы соединений (SQL SERVER 2005) [SET BASED] - PullRequest
0 голосов
/ 03 октября 2009

у меня 3 стола

1) tblPurchaser, имеющий 2 столбца:

PurchaserId   PurchaserName
1             A1
2             A2
3             A3

2) tblCar с двумя столбцами:

CarId   Carname
11      C1
12      C2
13      C3
14      C4

И, наконец, это соединительная таблица tblInformation, где указывается информация о тех лицах, которые приобрели автомобили.

PurchaserId  CarId
1            11
1            12
2            11
2            13

Теперь мне нужно написать запрос на основе набора, где я смогу получить информацию о тех автомобилях, которые не были куплены лицами

Желаемый выход

PurchaserId  CarId
1            13
1            14
2            12
2            14      
3            11
3            12
3            13
3            14 

Примечание. Это проблема реального времени, которую я реализую в своем проекте. Из-за конфиденциальности компании, я изменил таблицы и информацию. Но моя ситуация похожа Пожалуйста, помогите мне

Отредактировано

Пока я написал этот запрос:

SELECT 1 as purchaserid,carid from tblcar
where carid not in (select carid from tblinformation where purchaserid = 1)
union all
SELECT 2 as purchaserid,carid from tblcar 
where carid not in (select carid from tblinformation where purchaserid = 2)
union all
SELECT 3 as purchaserid,carid from tblcar 
where carid not in (select carid from tblinformation where purchaserid = 3)

Но, как вы можете понять, я жестко запрограммировал идентификатор покупки. А также в режиме реального времени я не буду знать, сколько там будет идентификаторов. Так что все должно быть сделано во время выполнения.

Пожалуйста, помогите enter code here

Ответы [ 4 ]

2 голосов
/ 05 октября 2009

LEFT JOIN ... WHERE ... IS NULL на помощь:

SELECT tblPurchaser.PurchaserId, tblCar.CarId 
  FROM tblPurchaser JOIN tblCar 
  LEFT JOIN tblInformation ON(
    tblPurchaser.PurchaserId = tblInformation.PurchaserId 
    AND tblCar.CarId = tblInformation.CarId) 
  WHERE tblInformation.CarId IS NULL
2 голосов
/ 03 октября 2009

Подсказка: НЕ СУЩЕСТВУЕТ

Вы действительно должны попытаться сделать домашнее задание самостоятельно ... 3-й вопрос сегодня ...

1 голос
/ 05 октября 2009

Попробуйте это

 select pur.PurchaserId, car.CarId
   from tblPurchaser pur, tblCar car
  where not exists (select 1 from tblInformation  where PurchaserId = pur. PurchaserId and CarId = car. CarId) 
 order by pur.PurchaserId;
1 голос
/ 03 октября 2009

Попробуйте это:

SELECT PurchaserID, CarID
FROM Purchasers
CROSS JOIN Cars
    EXCEPT
SELECT *
FROM tblInformation

Вот скрипт SQL, который демонстрирует, что этот метод работает правильно:

declare @soPurchaser table(PurchaserId int,  PurchaserName varchar(4));
insert @soPurchaser select 1,'A1'
insert @soPurchaser select 2,'A2'
insert @soPurchaser select 3,'A3'

Declare @SOtblCar table(CarId int, Carname varchar(4))
insert @SOtblCar select 11,'C1'
insert @SOtblCar select 12,'C2'
insert @SOtblCar select 13,'C3'
insert @SOtblCar select 14,'C4'

Declare @SOtblInfo table(PurchaserId int, CarId int)
insert @SOtblInfo select 1,11
insert @SOtblInfo select 1,12
insert @SOtblInfo select 2,11
insert @SOtblInfo select 2,13

SELECT PurchaserID, CarID
FROM @soPurchaser
CROSS JOIN @SOtblCar
    EXCEPT
SELECT *
FROM @SOtblInfo

Операторы набора SQL (UNION, INTERSECT и EXCEPT) работают с двумя таблицами. Вы заметите, что у них нет возможности отобразить столбцы из одного набора в другой. Во всех случаях в SQL, когда столбцы должны быть сопоставлены друг с другом, но нет синтаксиса, чтобы сделать это явно, они всегда отображаются на основе столбец заказ .

Так что в этом одном случае, если у вас неправильный порядок столбцов в таблице, он не будет работать правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...