الانتقال إلى المحتوى الرئيسي
تعيد عبارة INTERSECT فقط الصفوف المشتركة بين ناتجَي الاستعلام الأول والاستعلام الثاني. ويجب أن تتطابق الاستعلامات من حيث عدد الأعمدة وترتيبها ونوعها. وقد تحتوي نتيجة INTERSECT على صفوف مكررة. تُنفَّذ عبارات INTERSECT المتعددة من اليسار إلى اليمين إذا لم تُحدَّد أقواس. ويكون لمعامل INTERSECT أولوية أعلى من عبارتي UNION وEXCEPT.
SELECT column1 [, column2 ]
FROM table1
[WHERE condition]

INTERSECT

SELECT column1 [, column2 ]
FROM table2
[WHERE condition]

يمكن أن يكون الشرط أي تعبير وفقًا لمتطلباتك.

أمثلة

فيما يلي مثال بسيط على تقاطع الأرقام من 1 إلى 10 مع الأرقام من 3 إلى 8:
Query
SELECT number FROM numbers(1,10) INTERSECT SELECT number FROM numbers(3,8);
Response
┌─number─┐
│      3 │
│      4 │
│      5 │
│      6 │
│      7 │
│      8 │
└────────┘
تكون INTERSECT مفيدة إذا كان لديك جدولان يشتركان في عمود واحد (أو عدة أعمدة). يمكنك إيجاد تقاطع نتائج استعلامين، ما دامت النتائج تحتوي على الأعمدة نفسها. على سبيل المثال، لنفترض أن لدينا بضعة ملايين من الصفوف من بيانات تاريخية للعملات المشفرة تتضمن أسعار التداول والحجم:
Query
CREATE TABLE crypto_prices
(
    trade_date Date,
    crypto_name String,
    volume Float32,
    price Float32,
    market_cap Float32,
    change_1_day Float32
)
ENGINE = MergeTree
PRIMARY KEY (crypto_name, trade_date);

INSERT INTO crypto_prices
   SELECT *
   FROM s3(
    'https://learn-clickhouse.s3.us-east-2.amazonaws.com/crypto_prices.csv',
    'CSVWithNames'
);

SELECT * FROM crypto_prices
WHERE crypto_name = 'Bitcoin'
ORDER BY trade_date DESC
LIMIT 10;
Response
┌─trade_date─┬─crypto_name─┬──────volume─┬────price─┬───market_cap─┬──change_1_day─┐
│ 2020-11-02 │ Bitcoin     │ 30771456000 │ 13550.49 │ 251119860000 │  -0.013585099 │
│ 2020-11-01 │ Bitcoin     │ 24453857000 │ 13737.11 │ 254569760000 │ -0.0031840964 │
│ 2020-10-31 │ Bitcoin     │ 30306464000 │ 13780.99 │ 255372070000 │   0.017308505 │
│ 2020-10-30 │ Bitcoin     │ 30581486000 │ 13546.52 │ 251018150000 │   0.008084608 │
│ 2020-10-29 │ Bitcoin     │ 56499500000 │ 13437.88 │ 248995320000 │   0.012552661 │
│ 2020-10-28 │ Bitcoin     │ 35867320000 │ 13271.29 │ 245899820000 │   -0.02804481 │
│ 2020-10-27 │ Bitcoin     │ 33749879000 │ 13654.22 │ 252985950000 │    0.04427984 │
│ 2020-10-26 │ Bitcoin     │ 29461459000 │ 13075.25 │ 242251000000 │  0.0033826586 │
│ 2020-10-25 │ Bitcoin     │ 24406921000 │ 13031.17 │ 241425220000 │ -0.0058658565 │
│ 2020-10-24 │ Bitcoin     │ 24542319000 │ 13108.06 │ 242839880000 │   0.013650347 │
└────────────┴─────────────┴─────────────┴──────────┴──────────────┴───────────────┘
لنفترض الآن أن لدينا جدولًا باسم holdings يحتوي على قائمة بالعملات المشفّرة التي نملكها، إلى جانب عدد الوحدات من كلٍّ منها:
Query
CREATE TABLE holdings
(
    crypto_name String,
    quantity UInt64
)
ENGINE = MergeTree
PRIMARY KEY (crypto_name);

INSERT INTO holdings VALUES
   ('Bitcoin', 1000),
   ('Bitcoin', 200),
   ('Ethereum', 250),
   ('Ethereum', 5000),
   ('DOGEFI', 10);
   ('Bitcoin Diamond', 5000);
يمكننا استخدام INTERSECT للإجابة عن أسئلة مثل “ما العملات التي نملكها والتي تم تداولها بسعر يتجاوز 100 دولار؟”:
Query
SELECT crypto_name FROM holdings
INTERSECT
SELECT crypto_name FROM crypto_prices
WHERE price > 100
Response
┌─crypto_name─┐
│ Bitcoin     │
│ Bitcoin     │
│ Ethereum    │
│ Ethereum    │
└─────────────┘
وهذا يعني أنه في وقتٍ ما، جرى تداول Bitcoin وEthereum فوق 100 دولار، بينما لم يُتداول DOGEFI وBitcoin Diamond فوق 100 دولار مطلقًا (على الأقل استنادًا إلى البيانات المتاحة لدينا هنا في هذا المثال).

INTERSECT DISTINCT

لاحظ أنه في الاستعلام السابق كانت لدينا عدة حيازات من Bitcoin وEthereum جرى تداولها بأكثر من 100 دولار. وقد يكون من الأفضل إزالة الصفوف المكررة (لأنها لا تضيف إلا تكرارًا لما نعرفه بالفعل). يمكنك إضافة DISTINCT إلى INTERSECT لإزالة الصفوف المكررة من النتيجة:
Query
SELECT crypto_name FROM holdings
INTERSECT DISTINCT
SELECT crypto_name FROM crypto_prices
WHERE price > 100;
Response
┌─crypto_name─┐
│ Bitcoin     │
│ Ethereum    │
└─────────────┘
انظر أيضًا
آخر تعديل في ٢٩ يونيو ٢٠٢٦