2015-05-16 4 views
2

Я хотел бы использовать INNER JOIN на одном столе. Но я получаю сообщение об ошибке:Self-join table в SQL Server 2008

Msg 208, Level 16, State 1, Line 1
Неверное имя объекта 'а'.

Мой запрос:

select * 
from 
    (select 
     *, 
     ROW_NUMBER() OVER (ORDER BY GoodMainCode) as row 
    from [SarMem].[dbo].[Book_Data1] 
    where GoodName like '%A%' and GroupCode = 115) a 
    inner join a b on b.GoodMainCode = a.GoodMainCode 
where a.row > 0 and a.row <= 100 

обновленный

enter image description here

+0

таблица является псевдонимом. –

+0

Учитывая, что b является реальным именем таблицы, замените свое соединение, например. выберите * From B inner join (некоторый запрос) a на a.id = b.id. Если b является псевдонимом, псевдоним чего? –

+0

@marc_s, я думаю, что это просто псевдоним для здесь –

ответ

3

Делают это с КТР:

;with a as(select *, ROW_NUMBER() OVER (ORDER BY GoodMainCode) as row 
      from [SarMem].[dbo].[Book_Data1] 
      where GoodName like '%A%' and GroupCode = 115) 
select * from a 
join a b on b.GoodMainCode = a.GoodMainCode 
where a.row > 0 and a.row <= 100 
+0

, но он хорошо работает. например, у меня есть три перекодировки из того же значения GoodMainCode. обновил мой вопрос. –

+0

Добавьте некоторые тестовые данные и ожидаемый результат. Непонятно, что вы хотите. –

0

Может что-то л ike что?

WITH List AS (
SELECT 
    ROW_NUMBER() OVER (ORDER BY GoodMainCode) AS Row, * 
FROM 
    [SarMem].[dbo].[Book_Data1] 
WHERE 
    (GoodName like '%A%') 
    AND (GroupCode = 115) 
) 
SELECT * FROM List WHERE Row between 1 and 100 
0

Я думаю, что здесь a это псевдоним имя не имя таблицы. Поэтому SQL SERVER не позволит a создать еще один псевдоним b.

Итак, если вы хотите использовать ту же таблицу, что и a, вам также нужно переписать подзапрос для b.

Мол,

select * from (
select *,ROW_NUMBER() OVER (ORDER BY GoodMainCode) as row from [SarMem].[dbo].[Book_Data1] where GoodName like '%A%' and GroupCode = 115 ) a 
INNER JOIN (
select *,ROW_NUMBER() OVER (ORDER BY GoodMainCode) as row from [SarMem].[dbo].[Book_Data1] where GoodName like '%A%' and GroupCode = 115 ) b on b.GoodMainCode = a.GoodMainCode where a.row > 0 and a.row <= 100