سؤال

أود حقًا معرفة ما إذا كان من الممكن القيام ببيان محدد ، والذي يعيد نفس السجلات بالضبط ، التي نضعها في ذلك في بند؟

عينة:

select * from table
where table_id in (1, 2, 3, 666);

يحتوي هذا الجدول على مثال على ID-S فقط من 1 إلى 100 ، لذلك سيعود هذا الاختيار ثلاثة صفوف فقط. ما يجب علي فعله ، للحصول على صف واحد (ربما لاغية أو دمية) ل 666؟

شكرًا!

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

المحلول

يمكنك استخدام الاتحاد:

select * from table
where table_id in (1, 2, 3);
union
select 666 as table_id, other_fields_with_dummy_values_in_table from dual;

هو كيف يمكنك أن تفعل ذلك في أوراكل. ال from dual قد تختلف حسب نظام قاعدة البيانات الذي تستخدمه.

فقط كن على دراية أنه إذا كنت تستخدم Union ، فيجب على استعلام Dummy تحديد السجلات نفسها مثل الاستعلام الحقيقي.

نصائح أخرى

يمكنك الاختيار بدون جدول

فقط قم بالاتحاد مع استفسارك

select table_id, some_column from table
where table_id in (1, 2, 3, 666);
union
select 666, 'dummy_data'

على افتراض جدول numbers تحتوي على جميع الأرقام من 1 إلى 1000000 (في الواقع بما يكفي بحيث يتم تغطية نطاق قيم الإدخال الخاصة بك) ، يمكنك تشغيل SQL التالي:

SELECT *
  FROM numbers left outer join table on table.table_id = numbers.number
 WHERE numbers.number in (1, 2, 3, 666)

إذا كنت تستخدم DBMS يوفر حلاً أفضل ، مثل EG SQL في أي مكان معها sa_rowgenerator الإجراء ، يمكنك استبدال الجدول numbers مع مكالمة الإجراءات ، وليس لديك حد أقصى رقم.

IN البند هو مسند منطقي ، لذلك ستحتاج إلى استبداله بمجموعة سجل وهمية:

SELECT  m.*
FROM    (
        SELECT  1 AS id
        UNION ALL
        SELECT  2 AS id
        UNION ALL
        SELECT  3 AS id
        UNION ALL
        SELECT  666 AS id
        ) q
LEFT JOIN
        mytable m
ON      m.id = q.id

في SQL Server 2008, ، يمكنك تشغيل هذا الاستعلام:

SELECT  *
FROM    @mydata d
LEFT JOIN
        mytable t
ON      t.id = d.id

مع @mydate هو متغير الجدول ، تم تمريره كمعلمة من العميل.

في PostgreSQL, ، يمكنك تشغيل هذا الاستعلام:

SELECT  *
FROM    (
        SELECT  :arr[s] AS id
        FROM    generate_series(1, array_upper(:arr, 1)) s
        ) q
LEFT JOIN
        mytable t
ON      t.id = q.id

أين :arr هي صفيف [1, 2, 3, 666], ، مرت أيضا من العميل كمعلمة.

في Oracle, ، يمكنك ان تفعل:

SELECT  *
FROM    TABLE(:mycol) q
LEFT JOIN
        mytable t
ON      t.id = q.id

, ، أين :mycol هو متغير من نوع المجموعة ، تم تمريره من العميل.

طريقة واحدة للتفكير في الأمر هي: ستحتاج إلى أن تكون هذه البيانات "إدخال" الاستعلام كمجموعة بيانات. البيانات الموجودة في المكان الذي تتم فيه "إضافة" الجمل إلى الاستعلام ، فهي تستخدم فقط لتصفية البيانات الحالية.

مثال سريع:

DECLARE @MustInclude (Value  int  not null)

INSERT @MustInclude (Value) values (1)
INSERT @MustInclude (Value) values (2)
INSERT @MustInclude (Value) values (3)
INSERT @MustInclude (Value) values (666)

SELECT *
 from @MustInclude mi
  left outer join MyTable mt
   on mt.Value = mi.Value
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top