آیا هنوز گیر کردهاید؟
چه کاری انجام دهید وقتی پرسوجوی شما داده با ردیفها یا ستونهای تکراری برمیگرداند.
عیبیابی دادههای تکراری در نتایج پرسوجوی SQL
چه کاری انجام دهید وقتی پرسوجوی شما داده با ردیفها یا ستونهای تکراری برمیگرداند.
داده شما کجا تکراری میشود؟
ردیفهای تکراری
قبل از شروع، مطمئن شوید schemaهای جداول یا پرسوجوهای تودرتو منبع خود را میدانید.
- آیا بند
GROUP BYرا گم کردهاید؟ - بررسی کنید که آیا جداول یا پرسوجوهای منبع شما ردیفهای تکراری دارند. باید مراحل 3 و 4 را برای هر جدول یا نتیجه پرسوجویی که شامل ردیفهای تکراری است تکرار کنید.
-- اگر row_count بیشتر از 1 باشد، -- ردیفهای تکراری در نتایج خود دارید. SELECT < your_columns >, COUNT(*) AS row_count FROM < your_table_or_upstream_query > GROUP BY < your_columns > ORDER BY row_count DESC; - جدول زیر را بررسی کنید تا ببینید نوع join شما چگونه با رابطههای جدول شما تعامل میکند.
- نوع join خود را تغییر دهید یا رابطههای جدول خود را کاهش دهید.
توضیح
ردیفها میتوانند به طور تصادفی تکراری شوند وقتی داده در سیستمهای upstream یا کارهای ETL بهروز میشود.
برخی جداول ردیفهایی دارند که در نگاه اول شبیه تکراری به نظر میرسند. این با جداولی که تغییرات وضعیت را ردیابی میکنند رایج است (مثلاً یک جدول وضعیت سفارش که هر بار که وضعیت تغییر میکند یک ردیف اضافه میکند). جداول وضعیت ممکن است ردیفهایی داشته باشند که دقیقاً یکسان به نظر میرسند، به جز timestamp ردیف. میتواند دشوار باشد تشخیص دهید که آیا جداولی با ستونهای زیاد دارید، پس حتماً مرحله 2 بالا را اجرا کنید یا از مدیر پایگاه داده خود بپرسید اگر مطمئن نیستید.
اگر joinهای خود را با فرض یک رابطه یک به یک برای جداولی که در واقع یک رابطه یک به چند یا چند به چند دارند نوشتهاید، برای هر تطابق در جدول "چند" ردیف تکراری دریافت خواهید کرد.
مطالعه بیشتر
- دلایل رایج برای نتایج پرسوجوی غیرمنتظره
- ترکیب جداول با join
- مشکلات رایج با joinهای SQL
- Schema چیست؟
- رابطههای جدول پایگاه داده
انواع join و رابطههای جدول
این جدول خلاصه میکند که انواع join چگونه با رابطههای جدول تعامل میکنند تا تکراری تولید کنند وقتی ردیفهای مطابق پیدا میشوند.
| A یک به یک با B است | A یک به چند با B است | A چند به چند با B است | |
|---|---|---|---|
| A INNER JOIN B | هیچ ردیف تکراری. | هیچ ردیف تکراری. | ردیفهای تکراری از A یا B. |
| A LEFT JOIN B | هیچ ردیف تکراری. | تکراریهای ممکن از جدول B. | ردیفهای تکراری از A یا B. |
| B LEFT JOIN A | هیچ ردیف تکراری. | تکراریهای ممکن از جدول B. | ردیفهای تکراری از A یا B. |
| A OUTER JOIN B | هیچ ردیف تکراری. | تکراریهای ممکن از جدول B. | ردیفهای تکراری از A یا B. |
| A FULL JOIN B | هیچ ردیف تکراری. | ردیفهای تکراری از جدول B. | ردیفهای تکراری از A یا B. |
نحوه کاهش رابطههای جدول
اگر ردیفهای تکراری دارید چون یک رابطه یک به یک را فرض میکنید وقتی در واقع جداولی دارید که یک به چند یا چند به چند هستند، میتوانید تکراریها را با استفاده از:
- یک INNER JOIN برای یک رابطه یک به چند حذف کنید.
- یک CTE با تابع تجمیع برای یک رابطه یک به چند یا چند به چند.
به عنوان مثال:
-- فرض کنید table_a یک یک به چند با table_b است.
-- پرسوجوی زیر ردیفها را از table_b تکراری میکند
-- برای هر ردیف مطابق در table_a.
SELECT
< your_columns >
FROM
table_a
LEFT JOIN table_b ON key_a = key_b;
گزینه 1: استفاده از INNER JOIN با رابطه یک به چند
-- پرسوجوی زیر یک ردیف از table_b دریافت میکند
-- برای هر ردیف مطابق در table_a.
SELECT
< your_columns >
FROM
table_a
INNER JOIN table_b ON key_a = key_b;
گزینه 2: استفاده از CTE برای کاهش رابطه جدول
-- پرسوجوی زیر مقادیر تجمیع شده از table_b دریافت میکند
-- برای هر ردیف مطابق در table_a.
WITH table_b_reduced AS (
SELECT
AGGREGATE_FUNCTION (< your_columns >)
FROM
table_b_reduced
GROUP BY
< your_columns >
)
SELECT
< your_columns >
FROM
table_a
JOIN table_b_reduced ON key_a = key_b_reduced;
ستونهای تکراری
- اگر داده را join میکنید، بررسی کنید که آیا عبارت
SELECTشما شامل هر دو ستون کلید اصلی و کلید خارجی است. - بررسی کنید که آیا ستونهای شما در منبع تکراری هستند با دنبال کردن مراحل در عیبیابی منطق SQL.
- بیشتر درباره دلایل رایج برای نتایج پرسوجوی غیرمنتظره یاد بگیرید.
آیا مشکل متفاوتی دارید؟
- نتیجه من داده گمشده دارد.
- تجمیعهای من (شمارشها، مجموعها و غیره) اشتباه هستند.
- تاریخها و زمانهای من اشتباه هستند.
- داده من بهروز نیست.
- یک خطای نحو SQL دارم.
- یک پیام خطا دارم که خاص پرسوجو یا نحو SQL من نیست.
آیا هنوز گیر کردهاید؟
جستجو کنید یا از جامعه متابیس بپرسید.