> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-8c05c8a2.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> توثيق دالة arrayJoin

# دالة arrayJoin

هذه دالة غير اعتيادية للغاية.

الدوال العادية لا تغيّر مجموعة من الصفوف، بل تغيّر فقط القيم في كل صف (`map`).
أما الدوال التجميعية فتضغط مجموعة من الصفوف (الطي أو الاختزال).
وتأخذ الدالة `arrayJoin` كل صف وتولّد منه مجموعة من الصفوف (الفرد).

تأخذ هذه الدالة مصفوفة كوسيط، وتكرّر الصف الأصلي إلى عدة صفوف بعدد العناصر الموجودة في المصفوفة.
وتُنسخ جميع القيم في الأعمدة كما هي، باستثناء القيم في العمود الذي تُطبَّق عليه هذه الدالة، إذ تُستبدل بقيمة العنصر المقابل من المصفوفة.

<Note>
  إذا كانت المصفوفة فارغة، فإن `arrayJoin` لا ينتج أي صفوف.
  ولإرجاع صف واحد يحتوي على القيمة الافتراضية لنوع المصفوفة، يمكنك تغليفها بـ [emptyArrayToSingle](/ar/reference/functions/regular-functions/array-functions#emptyArrayToSingle)، على سبيل المثال: `arrayJoin(emptyArrayToSingle(...))`.
</Note>

على سبيل المثال:

```sql title="Query" theme={null}
SELECT arrayJoin([1, 2, 3] AS src) AS dst, 'Hello', src
```

```text title="Response" theme={null}
┌─dst─┬─\'Hello\'─┬─src─────┐
│   1 │ Hello     │ [1,2,3] │
│   2 │ Hello     │ [1,2,3] │
│   3 │ Hello     │ [1,2,3] │
└─────┴───────────┴─────────┘
```

تؤثر الدالة `arrayJoin` في جميع أجزاء الاستعلام، بما في ذلك قسم `WHERE`. لاحظ أن نتيجة الاستعلام أدناه هي `2`، رغم أن الاستعلام الفرعي أعاد صفًا واحدًا.

```sql title="Query" theme={null}
SELECT sum(1) AS impressions
FROM
(
    SELECT ['Istanbul', 'Berlin', 'Babruysk'] AS cities
)
WHERE arrayJoin(cities) IN ['Istanbul', 'Berlin'];
```

```text title="Response" theme={null}
┌─impressions─┐
│           2 │
└─────────────┘
```

يمكن للاستعلام استخدام عدة دوال `arrayJoin`. في هذه الحالة، يُنفَّذ التحويل عدة مرات وتتضاعف الصفوف.
على سبيل المثال:

```sql title="Query" theme={null}
SELECT
    sum(1) AS impressions,
    arrayJoin(cities) AS city,
    arrayJoin(browsers) AS browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
    2,
    3
```

```text title="Response" theme={null}
┌─impressions─┬─city─────┬─browser─┐
│           2 │ Istanbul │ Chrome  │
│           1 │ Istanbul │ Firefox │
│           2 │ Berlin   │ Chrome  │
│           1 │ Berlin   │ Firefox │
│           2 │ Babruysk │ Chrome  │
│           1 │ Babruysk │ Firefox │
└─────────────┴──────────┴─────────┘
```

<div id="important-note">
  ### أفضل الممارسات
</div>

قد لا يؤدي استخدام عدة `arrayJoin` مع التعبير نفسه إلى النتائج المتوقعة بسبب إزالة التعبيرات الفرعية المشتركة.
في هذه الحالات، يُنصح بتعديل تعبيرات المصفوفة المكررة عبر إضافة عمليات لا تؤثر في نتيجة `arrayJoin`. على سبيل المثال،  `arrayJoin(arraySort(arr))`, `arrayJoin(arrayConcat(arr, []))`

مثال:

```sql title="Query" theme={null}
SELECT
    arrayJoin(dice) AS first_throw,
    /* arrayJoin(dice) as second_throw */ -- is technically correct, but will annihilate result set
    arrayJoin(arrayConcat(dice, [])) AS second_throw -- intentionally changed expression to force re-evaluation
FROM (
    SELECT [1, 2, 3, 4, 5, 6] AS dice
);
```

لاحظ بنية [`ARRAY JOIN`](/ar/reference/statements/select/array-join) في استعلام SELECT، إذ تتيح إمكانات أوسع.
يتيح `ARRAY JOIN` تحويل عدة مصفوفات لها العدد نفسه من العناصر دفعةً واحدة.

مثال:

```sql title="Query" theme={null}
SELECT
    sum(1) AS impressions,
    city,
    browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
ARRAY JOIN
    cities AS city,
    browsers AS browser
GROUP BY
    2,
    3
```

```text title="Response" theme={null}
┌─impressions─┬─city─────┬─browser─┐
│           1 │ Istanbul │ Firefox │
│           1 │ Berlin   │ Chrome  │
│           1 │ Babruysk │ Chrome  │
└─────────────┴──────────┴─────────┘
```

أو يمكنك استخدام [`Tuple`](/ar/reference/data-types/tuple)

مثال:

```sql title="Query" theme={null}
SELECT
    sum(1) AS impressions,
    (arrayJoin(arrayZip(cities, browsers)) AS t).1 AS city,
    t.2 AS browser
FROM
(
    SELECT
        ['Istanbul', 'Berlin', 'Babruysk'] AS cities,
        ['Firefox', 'Chrome', 'Chrome'] AS browsers
)
GROUP BY
    2,
    3
```

```text title="Row" theme={null}
┌─impressions─┬─city─────┬─browser─┐
│           1 │ Istanbul │ Firefox │
│           1 │ Berlin   │ Chrome  │
│           1 │ Babruysk │ Chrome  │
└─────────────┴──────────┴─────────┘
```

يأتي اسم `arrayJoin` في ClickHouse من تشابهه المفاهيمي مع عملية JOIN، ولكن عند تطبيقها على المصفوفات داخل صف واحد. فبينما تدمج عمليات JOIN التقليدية الصفوف من جداول مختلفة، يقوم `arrayJoin` "بضم" كل عنصر من عناصر المصفوفة داخل الصف، مما ينتج عنه عدة صفوف — صف واحد لكل عنصر في المصفوفة — مع تكرار قيم الأعمدة الأخرى. كما يوفّر ClickHouse أيضًا صياغة البند [`ARRAY JOIN`](/ar/reference/statements/select/array-join)، مما يجعل هذه الصلة بعمليات JOIN التقليدية أكثر وضوحًا من خلال استخدام مصطلحات SQL JOIN المألوفة. ويُشار إلى هذه العملية أيضًا باسم "فرد" المصفوفة، لكن يُستخدم مصطلح "join" في كلٍّ من اسم الدالة والبند لأنه يشبه ضم الجدول إلى عناصر المصفوفة، مما يؤدي فعليًا إلى توسيع مجموعة البيانات بطريقة مشابهة لعملية JOIN.
