Что не так с этим SQL? - PullRequest
       3

Что не так с этим SQL?

2 голосов
/ 19 июля 2010

Я уверен, что это что-то действительно простое, что я упускаю из виду, но MS SQL является новым для меня - хотя я (или, по крайней мере, думал, что я) был достаточно доволен базовым MySql, хотя.

SELECT l.link_id, l.link_allcount, d.desc_id, d.desc_count, d.desc_text, h.hour_17,   dl.day_19 
FROM lnktrk_links AS l, lnktrk_hourly AS h, lnktrk_daily AS dl 
LEFT JOIN lnktrk_descriptions AS d ON l.link_id = d.link_id 
WHERE l.link_id = h.link_id AND l.link_id = dl.link_id AND l.link_is_click = 1

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

'The multi-part identifier "l.link_id" could not be bound.

Однако l.link_id определенно существует. Следующий запрос без объединения работает должным образом:

SELECT l.link_id, l.link_allcount, d.desc_id, d.desc_count, d.desc_text, h.hour_17, dl.day_19 
FROM lnktrk_links AS l, lnktrk_hourly AS h, lnktrk_daily AS dl, lnktrk_descriptions AS d 
WHERE l.link_id = h.link_id AND l.link_id = dl.link_id AND d.link_id = l.link_id AND l.link_is_click = 1

Ответы [ 4 ]

2 голосов
/ 19 июля 2010

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

SELECT 
l.link_id, 
l.link_allcount, 
d.desc_id, 
d.desc_count, 
d.desc_text, 
h.hour_17,   
dl.day_19 

FROM lnktrk_links AS l
inner join lnktrk_hourly AS h
on l.link_id = h.link_id
inner join  lnktrk_daily AS dl
on l.link_id = dl.link_id 
LEFT JOIN lnktrk_descriptions AS d ON l.link_id = d.link_id 
WHERE   l.link_is_click = 1
1 голос
/ 19 июля 2010

Вы должны объединить их всех - вместо использования ОТ

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

SELECT l.link_id, l.link_allcount, d.desc_id, d.desc_count, d.desc_text, h.hour_17,   dl.day_19 
FROM lnktrk_links AS l
LEFT JOIN lnktrk_hourly AS h ON l.link_id = h.link_id
LEFT JOIN lnktrk_daily AS dl ON l.link_id = dl.link_id
LEFT JOIN lnktrk_descriptions AS d ON l.link_id = d.link_id 
WHERE l.link_is_click = 1
1 голос
/ 19 июля 2010

Я думаю, что синтаксис связывает

lnktrk_daily AS dl 
LEFT JOIN lnktrk_descriptions AS d 
    ON l.link_id = d.link_id 

более тесно, чем разделенные запятыми, поэтому у вас нет l в этой части

То, что у вас сгруппированокак:

SELECT l.link_id, l.link_allcount, d.desc_id, d.desc_count, d.desc_text, h.hour_17,   dl.day_19 
FROM lnktrk_links AS l, lnktrk_hourly AS h, 
( lnktrk_daily AS dl 
  LEFT JOIN lnktrk_descriptions AS d 
  ON l.link_id = d.link_id )
WHERE l.link_id = h.link_id AND l.link_id = dl.link_id AND l.link_is_click = 1
1 голос
/ 19 июля 2010

То, что LEFT JOIN объединяет lnktrk_daily AS dl с lnktrk_descriptions AS d - ни один из них не называется l, поэтому в контексте этого JOIN s ON предложения , l ничего не значит.

Похоже, что в данный момент вы используете стиль "перекрестное соединение плюс WHERE предложения", а не стиль "внутренние объединения с ON предложениями". Если вы переключитесь на последнее, то l должно иметь значение во всем предложении FROM.

...