سؤال

وعندي استفسار كبير في قاعدة بيانات كيو. الاستعلام هو شيء من هذا القبيل:

SELECT * FROM table1, table2, ... WHERE table1.id = table2.id...

وعند تشغيل هذا الاستعلام كما استعلام SQL، وذلك يعود الصف المطلوبين.

ولكن عندما يحاول استخدام نفس الاستعلام لإنشاء طريقة عرض، تقوم بإرجاع خطأ:

و"خطأ: العمود" معرف ". تحديد أكثر من مرة"

و(I استخدام pgAdminIII عند تنفيذ الاستعلامات.)

وأنا أعتقد أن هذا يحدث لأن resultset وسيكون أكثر من عمود واحد يسمى "معرف". هل هناك نوعا لحل هذه، دون كتابة كل أسماء الأعمدة في الاستعلام؟

هل كانت مفيدة؟

المحلول

وهذا يحدث لأن الرأي سيكون اثنين معرف اسمه الأعمدة، واحدة من table1 و واحد من table2، بسبب حدد *.

وتحتاج إلى تحديد أي معرف تريد في طريقة العرض.

SELECT table1.id, column2, column3, ... FROM table1, table2 
WHERE table1.id = table2.id

والاستعلام يعمل لأنه يمكن أن يكون اسمه على قدم المساواة الأعمدة ...

postgres=# select 1 as a, 2 as a;
 a | a
---+---
 1 | 2
(1 row)

postgres=# create view foobar as select 1 as a, 2 as a;
ERROR:  column "a" duplicated
postgres=# create view foobar as select 1 as a, 2 as b;
CREATE VIEW

نصائح أخرى

إذا تتكرر سوى الانضمام الأعمدة (أي لها نفس الأسماء)، ثم يمكنك الحصول على بعيدا مع تغيير:

select *
from a, b
where a.id = b.id

إلى:

select *
from a join b using (id)

إذا كنت حصلت هنا لأنك تحاول استخدام دالة مثل to_date والحصول على خطأ "تعريف أكثر من مرة واحدة"، لاحظ أن تحتاج إلى استخدام اسم مستعار العمود وظائف، منها مثلا:

to_date(o.publication_date, 'DD/MM/YYYY') AS publication_date

وبأي حال من الأحوال المضمنة في اللغة لحلها (وبصراحة، * هو ممارسة سيئة بشكل عام لأنه يمكن أن يسبب تشوهات كامنة لتنشأ مثل المخططات الجدول تتغير - يمكنك القيام به TABLE1 *، table2.acolumn، tabl2.bcolumn إذا كنت تريد كل طاولة واحدة وبشكل انتقائي من آخر)، ولكن إذا كيو يدعم INFORMATION_SCHEMA، يمكنك أن تفعل شيئا مثل:

DECLARE @sql AS varchar

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + ']'
    + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION

PRINT @sql

ولصق النتائج في لانقاذ الكثير من الكتابة. سوف تحتاج إلى يدويا اسم مستعار الأعمدة التي لها نفس الاسم، بطبيعة الحال. يمكنك أيضا رمز جنرال أسماء فريدة إذا أردت (ولكن أنا لا):

SELECT @sql = COALESCE(@sql + ', ', '') 
    + '[' + TABLE_NAME + '].[' + COLUMN_NAME + '] '
    + 'AS [' + TABLE_NAME + '_' + COLUMN_NAME + ']'
    + CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME IN ('table1', 'table2')
ORDER BY TABLE_NAME, ORDINAL_POSITION
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top