Metabase

آیا هنوز گیر کرده‌اید؟

چه کاری انجام دهید وقتی پرس‌وجوی شما داده با ردیف‌ها یا ستون‌های تکراری برمی‌گرداند.

عیب‌یابی داده‌های تکراری در نتایج پرس‌وجوی SQL

چه کاری انجام دهید وقتی پرس‌وجوی شما داده با ردیف‌ها یا ستون‌های تکراری برمی‌گرداند.

داده شما کجا تکراری می‌شود؟

ردیف‌های تکراری

قبل از شروع، مطمئن شوید schemaهای جداول یا پرس‌وجوهای تودرتو منبع خود را می‌دانید.

  1. آیا بند GROUP BY را گم کرده‌اید؟
  2. بررسی کنید که آیا جداول یا پرس‌وجوهای منبع شما ردیف‌های تکراری دارند. باید مراحل 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;
  3. جدول زیر را بررسی کنید تا ببینید نوع join شما چگونه با رابطه‌های جدول شما تعامل می‌کند.
  4. نوع join خود را تغییر دهید یا رابطه‌های جدول خود را کاهش دهید.

توضیح

ردیف‌ها می‌توانند به طور تصادفی تکراری شوند وقتی داده در سیستم‌های upstream یا کارهای ETL به‌روز می‌شود.

برخی جداول ردیف‌هایی دارند که در نگاه اول شبیه تکراری به نظر می‌رسند. این با جداولی که تغییرات وضعیت را ردیابی می‌کنند رایج است (مثلاً یک جدول وضعیت سفارش که هر بار که وضعیت تغییر می‌کند یک ردیف اضافه می‌کند). جداول وضعیت ممکن است ردیف‌هایی داشته باشند که دقیقاً یکسان به نظر می‌رسند، به جز timestamp ردیف. می‌تواند دشوار باشد تشخیص دهید که آیا جداولی با ستون‌های زیاد دارید، پس حتماً مرحله 2 بالا را اجرا کنید یا از مدیر پایگاه داده خود بپرسید اگر مطمئن نیستید.

اگر joinهای خود را با فرض یک رابطه یک به یک برای جداولی که در واقع یک رابطه یک به چند یا چند به چند دارند نوشته‌اید، برای هر تطابق در جدول "چند" ردیف تکراری دریافت خواهید کرد.

مطالعه بیشتر

انواع 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.

نحوه کاهش رابطه‌های جدول

اگر ردیف‌های تکراری دارید چون یک رابطه یک به یک را فرض می‌کنید وقتی در واقع جداولی دارید که یک به چند یا چند به چند هستند، می‌توانید تکراری‌ها را با استفاده از:

به عنوان مثال:

-- فرض کنید 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;

ستون‌های تکراری

  1. اگر داده را join می‌کنید، بررسی کنید که آیا عبارت SELECT شما شامل هر دو ستون کلید اصلی و کلید خارجی است.
  2. بررسی کنید که آیا ستون‌های شما در منبع تکراری هستند با دنبال کردن مراحل در عیب‌یابی منطق SQL.
  3. بیشتر درباره دلایل رایج برای نتایج پرس‌وجوی غیرمنتظره یاد بگیرید.

آیا مشکل متفاوتی دارید؟

آیا هنوز گیر کرده‌اید؟

جستجو کنید یا از جامعه متابیس بپرسید.