كيفية تحديد قائمة القيم في عمود واحد متوفرة في عمودين مختلفين؟

2

لدي جدول X كـ:

|-column1-|-column2-|
|   a1    |   b4    |
|   a2    |   b5    |
|   a3    |   b6    |

أريد تحديد هذه القيم في عمود واحد كنتيجة:

|-result--|
|   a1    |
|   a2    |
|   a3    |
|   b4    |
|   b5    |
|   b6    |

يبدو شيئًا بسيطًا يجب القيام به ، ولكن كل الأسئلة التي أراها هي فقط ربط / دمج القيم في عمود واحد. أحتاج إلى إضافتها كـ "قائمة".

يمكنني استخدام شرط الاتحاد ، مثل:

select column1 as result from tableX
UNION
select column2 as result from tableX

لكن الأداء سيكون سيئًا (أبطأ 2x) وستكون عبارة SQL الخاصة بي هائلة لأن tableX هو استعلام فرعي معقد حقًا (سيء للصيانة وإمكانية القراءة).

تم وضع علامة MySQL ، لكنني سأقبل إجابات لجميع DBMSs

2 الاجابة

2
افضل جواب

أولا ، أود أن أوصي union all عوضا عن union ، وبالتالي:

select column1 as result from tableX
union all
select column2 as result from tableX;

union يتحمل النفقات العامة لإزالة التكرارات. إذا tableX هي طاولة ، ربما هذا جيد. على الرغم من أن الجدول يتم مسحه ضوئيًا مرتين ، إلا أنه في معظم الظروف ، ستكون صفحات الجدول موجودة بالفعل في ذاكرة التخزين المؤقت للصفحة ، لذا يجب أن يكون الفحص الثاني أسرع بكثير من الأول.

إذا tableX هو عرض معقد حقًا ، يمكنك القيام بشيء أكثر كفاءة:

select (case when n.n = 1 then column1 else column2 end) as column
from tableX cross join
     (select 1 as n union all select 2) n;

إذا كنت لا تزال بحاجة إلى إزالة التكرارات ، فاستخدمها select distinct :

select distinct (case when n.n = 1 then column1 else column2 end) as column
from tableX cross join
     (select 1 as n union all select 2) n;

ومع ذلك ، ربما سيؤدي ذلك إلى التراجع عن أي مكاسب في الأداء.

:مؤلف
0

كما قال جوردون :

Although the table is scanned twice, under most circumstances, the table pages will already be in the page cache, so the second scan should be much faster than the first.

إذا لم يكن أداء النقابة يمثل مشكلة ، فقد وجدت حلاً آخر للإجابة "النظيفة". مشكلتي هي عدم تكرار الاستعلام الفرعي tableX مرتين لأنه استعلام فرعي معقد حقًا ، لذلك يمكنني استخدام جدول مؤقت لهذا:

create temporary table tableX
select * from (...) -- complex query

ثم:

select column1 as result from tableX
union all
select column2 as result from tableX;
:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام