2010-07-19 7 views
2

Je suis sûr que c'est quelque chose de vraiment simple que je néglige, mais MS SQL est nouveau pour moi - je suis (ou du moins pensé que j'étais) assez à l'aise avec MySQL de base cependant.Quel est le problème avec ce SQL?

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 

L'erreur que je reçois est:

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

Cependant l.link_id existe certainement. La requête suivante sans jointure fonctionne comme prévu:

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 
+0

Notez que l.link_id est une clé primaire. (d.link_id ne l'est pas). – Jhong

+1

C'est une très mauvaise pratique d'utiliser des jointures implicites et le problème que vous avez ici est l'une des raisons pour lesquelles. Cette syntaxe est obsolète depuis 18 ans, pourquoi l'utilisez-vous encore? Vous devez toujours utiliser des jointures explicites. Les jointures explicites sont plus faciles à maintenir et moins susceptibles de causer des problèmes tels que des jointures accidentelles. Il n'y a aucune excuse pour utiliser une jointure implicite, vous n'y gagnez rien et ils sont sujets aux erreurs. – HLGEM

+0

Une question similaire a été répondue [ici] (http://stackoverflow.com/questions/206558/what-is-a-multi-part-identifier-and-why-cant-it-be-bound) –

Répondre

1

Je pense qu'il est que la syntaxe se fixe

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

plus étroitement que les clauses séparées par des virgules si vous n'avez pas l dans cette partie

Ce que vous avez regroupés comme:

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 
+0

Yup, c'est nouveau pour moi. Déplacer lnktrk_links AS l à la dernière clause séparée par des virgules l'a corrigé. Pour être honnête, je pensais que le paramètre "joindre quoi à quoi" était entièrement exprimé dans la partie "ON x = y" de la clause JOIN? Est-ce différent dans MySql/MS SQL ou est-ce que je n'ai pas été éclairé? Je ne suis pas sûr de savoir comment il est logique que vous pouvez exprimer le "ON x = y" et ne pas être pleinement qualifié comment fonctionne la jointure. – Jhong

2

essayez ceci:

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

Ce LEFT JOIN se joint lnktrk_daily AS dl avec lnktrk_descriptions AS d - ni d'entre eux sont appelés l, si dans le cadre de cette JOIN s ON la clause, l ne veut rien dire.

Il semblerait que vous utilisiez actuellement le style 'cross join plus WHERE clauses' plutôt que le style 'jointures internes avec clauses ON'. Si vous passez à ce dernier alors l devrait avoir une signification à travers la clause entière FROM.

1

Vous devriez les rejoindre tous - au lieu d'utiliser dE

Essayez cette

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

Ne crées pas pour ajouter un index pour les clés non primaires qui sont utilisées pour les jointures égales ou where clauses! –

+0

Merci. Les autres jointures ont cependant une relation 1: 1 - seules les descriptions peuvent en avoir plus d'une pour chaque ID de lien. Je pourrais utiliser INNER JOIN, mais je pensais que From et où x = y était synonyme de cela? – Jhong

+0

En théorie oui - mais une jointure devrait être plus rapide et mieux optimisée.Vous avez plus d'options dans les jointures - voir les jointures interne/externe, gauche/droite. Un conseil pour les jointures est ici: http://stackoverflow.com/questions/419375/sql-join-differences –