2016-02-02 3 views
0

Я пытаюсь ознакомиться с нормализацией, и у меня возникла проблема в том, что я пытаюсь объединить три таблицы вместе, чтобы создать один массивный SELECT, который предоставит всю информацию о людях в таблице TCustomers, m unsure, как это сделать. Вот моя структура таблицы:Как получить данные из таблицы SQL на основе идентификатора?

CREATE TABLE TCustomers (
    CustomerID  INT    IDENTITY(1,1) NOT NULL 
    ,FirstName  VARCHAR(50)  NOT NULL 
    ,LastName  VARCHAR(50)  NOT NULL 
    ,City   VARCHAR(50)  NOT NULL 
    ,[State]  VARCHAR(50)  NOT NULL 
    ,ZipCode  VARCHAR(50)  NOT NULL 
    ,EmailAddress VARCHAR(50)  NOT NULL 
    ,CONSTRAINT pkCustomers PRIMARY KEY (CustomerID) 
); 

CREATE TABLE TLocations (
    LocationID  INT    NOT NULL 
    ,LocationName VARCHAR(50)  NOT NULL 
    ,CONSTRAINT pkLocations PRIMARY KEY (LocationID) 
); 

CREATE TABLE TBenefitLevels (
    BenefitLevelID  INT    NOT NULL 
    ,BenefitLevelName VARCHAR(50)  NOT NULL 
    ,CONSTRAINT pkBenefitLevels PRIMARY KEY (BenefitLevelID) 
); 

CREATE TABLE TCustomerLocationBenefits (
    CustomerID  INT    NOT NULL 
    ,LocationID  INT    NOT NULL 
    ,BenefitLevelID INT    NOT NULL 
    ,CONSTRAINT pkCustomerLocationBenefits PRIMARY KEY (CustomerID, LocationID) 
); 

CREATE TABLE TCustomerStatus (
    CustomerID   INT    NOT NULL 
    ,FirstOrderDate  DATE   NOT NULL 
    ,NewestOrderDate DATE   NOT NULL   
    ,CONSTRAINT pkCustomerStatus PRIMARY KEY (CustomerID) 
); 

И я пытаюсь создать ЗЕЬЕСТ, который даст мне FirstName, LastName, город, [государство], ZipCode и EmailAddress из TCustomers, то BenefitLevelName, основанный на BenefitLevelID для каждого Клиента из TBenefitLevels, LocationName BASED на LocationID для каждого Клиента из TLocations. Я знаю, что это возможно, но я совершенно забыл, как это сделать, вот мой текущий ЗЕЬЕСТ, который получает идентификаторы необходимо, но не имена:

SELECT TC.FirstName, TC.LastName, TC.City, TC.[State], TC.ZipCode, TC.EmailAddress, TL.LocationName, TBL.BenefitLevelName, TCS.FirstOrderDate, TCS.NewestOrderDate 
FROM TCustomers AS TC 
    ,TLocations AS TL 
    ,TBenefitLevels AS TBL 
INNER JOIN TCustomerStatus AS TCS ON TC.CustomerID = TCS.CustomerID 
INNER JOIN TCustomerLocationBenefits AS TCLB ON TC.CustomerID = TCLB.CustomerID 

В настоящее время я получаю ошибку, что « многозначный идентификатор «TC.CustomerID» не может быть связан. Если я удалю TLocations и TBenefitLevels и заменим TL.LocationName и TBL.BenefitLevelName с их соответствующими идентификаторами в TCLB, он работает, но не так, как я этого хочу.

Пожалуйста, помогите!

ответ

1

Похоже TCustomerLocationBenefits это то, что я называю таблицу мостовую, иначе отображение таблицы или таблицы отношений а s содержит взаимосвязь между всеми тремя объектами: клиентом, местоположением и уровнем выгоды.

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

Смотрите, если ниже запрос возвращает то, что вы хотите увидеть:

select b.FirstName, b.LastName, b.City, b.State, b.ZipCode, b.EmailAddress 
    , c.BenefitLevelName 
    , d.LocationName 
from TCustomerLocationBenefits a 
join TCustomers b     on a.CustomerID = b.CustomerID 
join TBenefitLevels c    on a.BenefitLevelID = c.BenefitLevelID 
join TLocations d     on a.LocationID = d.LocationID 
+0

Это именно то, что мне нужно! Мне всегда казалось, что я должен начать с таблицы, в которой больше всего данных, но логика имеет смысл. Большое спасибо за помощь! – user3530169

Смежные вопросы