مشكلة الاسم المستعار لعمود Postgres
-
22-07-2019 - |
سؤال
باعتباري مبتدئًا في Postgresql (سأنتقل لأنني أنقل موقعي إلى Heroku الذي يدعمه فقط، يتعين علي إعادة صياغة بعض استفساراتي وأكوادها.إليك مشكلة لا أستطيع فهم المشكلة تمامًا:
PGError: ERROR: column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
^
...استفسار:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l_user_id = l2.user_id desc
تمت إضافة الجملة "l.user_id as l_user_id, l.geopoint_id as l_geopoint_id" لأنه من الواضح أن postgres لا يحب عبارات الترتيب مع الحقول غير المحددة.لكن الخطأ الذي أتلقىه الآن يجعل الأمر يبدو وكأنني لا أحصل على اسم مستعار أيضًا.أي شخص لديه خبرة postgres يرى المشكلة؟
من المحتمل أن أواجه مجموعة من هذه المشكلات - لقد عملت الاستعلامات بشكل جيد في mySql...
المحلول
في PostgreSQL، لا يمكنك استخدام التعبير باستخدام اسم مستعار بالترتيب.فقط الأسماء المستعارة البسيطة تعمل هناك.يجب أن يبدو الاستعلام الخاص بك كما يلي:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l.user_id = l2.user_id desc;
أفترض أنك تقصد ذلك l2.user_id=l.user_id
يجب أن تذهب أولا.
هذه هي الرسالة ذات الصلة في القائمة البريدية العامة لـ PostgreSQL.ما يلي في توثيق ORDER BY
بند:
كل تعبير يمكن أن يكون الاسم أو العدد الترتيبي لـ عمود الإخراج (حدد عنصر القائمة) ، أو يمكن أن يكون تشكل تعبير تعسفي من عمود الإدخال قيم.
لذلك لا توجد أسماء مستعارة عند استخدام التعبير.
نصائح أخرى
لديك:
order by l2.geopoint_id, l_user_id = l2.user_id desc
في الاستعلام الخاص بك.هذا بناء جملة غير قانوني.مسح ال = l2.user_id
الجزء (انقله إلى where
إذا كان هذا أحد شروط الانضمام) ويجب أن يعمل.
تحديث أدناه حدد (مع = l2.user_id
تمت إزالته) يجب أن يعمل بشكل جيد.لقد قمت باختباره (بأسماء جداول/أعمدة مختلفة، بوضوح) على Postgres 8.3
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l_user_id desc
وأنا واجهت نفس هذه المشكلة باستخدام وظائف من fuzzystrmatch - ولا سيما وظيفة levenshtein. أنا في حاجة إلى كل نوع من المسافة سلسلة، وتصفية النتائج حسب المسافة السلسلة. كنت أحاول في الأصل:
SELECT thing.*,
levenshtein(thing.name, '%s') AS dist
FROM thing
WHERE dist < character_length(thing.name)/2
ORDER BY dist
ولكن، بطبيعة الحال، وأنا حصلت على "عمود" خطأ حي "غير موجود" من جملة WHERE. حاولت هذا وعملت:
SELECT thing.*,
(levenshtein(thing.name, '%s')) AS dist
FROM thing
ORDER BY dist
ولكن أنا بحاجة إلى أن التأهيل في جملة WHERE. وقال شخص آخر في هذه المسألة أن يتم تقييم جملة WHERE قبل ORDER BY، وبالتالي كان العمود غير موجودة عندما قيمت شرط WHERE. تسير بها هذه النصيحة، وأنا أحسب أن عبارة SELECT متداخلة لا حيلة:
SELECT * FROM
(SELECT thing.*,
(levenshtein(thing.name, '%s')) AS dist
FROM thing
ORDER BY dist
) items
WHERE dist < (character_length(items.name)/2)
لاحظ أن يطلب من "البنود" الاسم المستعار الجدول والعمود الاسم المستعار حي يمكن الوصول إليه في الخارجية SELECT لأنها فريدة من نوعها في بيان. انها غير تقليدي بعض الشيء وأنا مندهش أنه يجب أن تكون على هذا النحو في PG - ولكن لا يبدو أن تأخذ الأداء ضرب لذلك أنا راض
و"وأضاف أنه على ما يبدو بوستجرس لا يحب بنود النظام مع الحقول لم يتم تحديد"
و"بقدر ما يذهب النظام من قبل - نعم، الإنترنت (وقواعد البيانات أخرى كثيرة) لا يسمح ترتيب بواسطة الأعمدة التي لم ترد في الفقرة حدد"
وفقط غير صحيح عادي.
و=> SELECT معرف من ORDER BY T1 صاحب LIMIT 5؛
معرف
و30 10 20 50 40 (5 صفوف)