SQL في جملة مع صفوف وهمية
-
01-10-2019 - |
سؤال
أود حقًا معرفة ما إذا كان من الممكن القيام ببيان محدد ، والذي يعيد نفس السجلات بالضبط ، التي نضعها في ذلك في بند؟
عينة:
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