SQL-корреляция - PullRequest
       2

SQL-корреляция

0 голосов
/ 12 октября 2009

У меня есть этот запрос:

SELECT COUNT (DISTINCT CUSTOMER_ACCOUNT.ID) AS  NUMBER_OF_ACCOUNTS 
FROM CUSTOMER_ACCOUNT 
INNER JOIN ACCOUNT ON CUSTOMER_ACCOUNT.ACCOUNT_ID=ACCOUNT.ID 
INNER JOIN CUSTOMER_ACCOUNT ON LOAD_ACCOUNT_DETAIL_0.ID = CUSTOMER_ACCOUNT.ID
WHERE Convert(datetime, convert(char(10), [CUSTOMER_ACCOUNT].CREATED_ON, 101)) BETWEEN '2009-01-01' AND '2009-05-1'
  AND CUSTOMER_ACCOUNT.DELETED!='1' 
  AND ACCOUNT.DELETED !='1'and  LOAD_ACCOUNT_DETAIL_0.ACCOUNT_STATUS='1'

Я получаю эту ошибку:

Сообщение 1013, Уровень 16, Состояние 1, Строка 1 Объекты "CUSTOMER_ACCOUNT" и "CUSTOMER_ACCOUNT" в предложении FROM имеют одинаковые открытые имена. Используйте имена корреляций, чтобы различать их.

Не знаете, как решить - есть идеи?

Ответы [ 5 ]

5 голосов
/ 12 октября 2009

Я думаю, вы только что допустили ошибку в своем SQL. Эта строка:

INNER JOIN CUSTOMER_ACCOUNT ON LOAD_ACCOUNT_DETAIL_0.ID = CUSTOMER_ACCOUNT.ID

Должно быть, это так?

INNER JOIN LOAD_ACCOUNT_DETAIL_0 ON LOAD_ACCOUNT_DETAIL_0.ID = CUSTOMER_ACCOUNT.ID

Если ваше намерение не состояло в том, чтобы на самом деле выполнить самообъединение, в этом случае вам нужно будет создать псевдоним имен таблиц (как уже упоминали другие)

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

вы указываете таблицу дважды в своем запросе 'CUSTOMER ACCOUNT' используется как FROM, так и в INNER JOIN.

Если вы измените свой запрос псевдонимами для таблиц CUSTOMER_ACCOUNT, у вас должно быть все в порядке.

пример:

FROM CUSTOMER_ACCOUNT AS cust_acct

INNER JOIN CUSTOMER_ACCOUNT as cust_acct_join

затем, когда вы ссылаетесь на столбцы, обязательно используйте созданный вами псевдоним

пример:

SELECT COUNT (DISTINCT **cust_acct.**CUSTOMER_ACCOUNT.ID) AS  NUMBER_OF_ACCOUNTS
0 голосов
/ 12 октября 2009

сделать что-то вроде:

SELECT COUNT (DISTINCT t1.ID) AS  NUMBER_OF_ACCOUNTS 
FROM CUSTOMER_ACCOUNT t1 INNER JOIN
ACCOUNT ON t1.ACCOUNT_ID=ACCOUNT.ID INNER JOIN
CUSTOMER_ACCOUNT t2 ON LOAD_ACCOUNT_DETAIL_0.ID = t2.ID
WHERE Convert(datetime,convert(char(10),t1.CREATED_ON,101)) 
BETWEEN '2009-01-01' AND '2009-05-1'  AND  t1.DELETED!='1' AND 
ACCOUNT.DELETED !='1' and  LOAD_ACCOUNT_DETAIL_0.ACCOUNT_STATUS='1'
0 голосов
/ 12 октября 2009

Если вы присоединяетесь к столу самостоятельно, вы должны использовать псевдонимы:

SELECT … FROM CUSTOMER_ACCOUNT AS C1 … CUSTOMER_ACCOUNT AS C2 …
0 голосов
/ 12 октября 2009

Вы присоединились к CUSTOMER_ACCOUNT. Вам нужен псевдоним хотя бы одного из них.

SELECT COUNT (DISTINCT CUSTOMER_ACCOUNT.ID) AS  NUMBER_OF_ACCOUNTS 
FROM CUSTOMER_ACCOUNT CA1 INNER JOIN
    ACCOUNT ON CA1.ACCOUNT_ID=ACCOUNT.ID INNER JOIN
    CUSTOMER_ACCOUNT CA2 ON LOAD_ACCOUNT_DETAIL_0.ID = CA2.CUSTOMER_ACCOUNT.ID
WHERE
Convert(datetime,convert(char(10),[CA1].CREATED_ON,101)) 
BETWEEN '2009-01-01' AND '2009-05-1'  AND  CA1.DELETED!='1' AND 
ACCOUNT.DELETED !='1'and  LOAD_ACCOUNT_DETAIL_0.ACCOUNT_STATUS='1'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...