الاستعلامات الفرعية ينفورميكس مع الخيار الأول
-
06-07-2019 - |
سؤال
ما هو أفضل وسيلة للتدوين رمز SQL للعمليات التالية لينفورميكس الديناميكي خادم (IDS) 9.40:
الهدف: أنا في حاجة إلى 50 أوامر الأولى مع خطوط ترتيب كل منها
select *
from (select top 50 * from orders) a inner join lines b
on a.idOrder = b.idOrder
ومشكلتي هي مع subselect لينفورميكس لا يسمح الخيار الأول في subselect.
وأي فكرة بسيطة؟.
المحلول
والجواب الرسمي سيكون 'الرجاء الترقية من IDS 9.40 منذ لم يعد معتمدا من قبل IBM. وهذا هو، IDS 9.40 ليس النسخة الحالية - ويجب (مثالي) ألا تستخدم
الحل لIDS 11.50
وعن طريق IDS 11.50، أستطيع أن أكتب:
SELECT *
FROM (SELECT FIRST 10 * FROM elements) AS e
INNER JOIN compound_component AS a
ON e.symbol = a.element
INNER JOIN compound AS c
ON c.compound_id = a.compound_id
;
وهذا هو أكثر أو أقل ما يعادلها على استفسارك. وبالتالي، إذا كنت تستخدم الإصدار الحالي من IDS، يمكنك كتابة الاستعلام باستخدام تقريبا نفس الرموز كما هو الحال في SQL للعمليات (باستخدام الأول والأهم في مكان TOP).
الحل لIDS 9.40
وماذا يمكنك أن تفعل في IDS 9.40؟ إسمح لي لحظة ... لا بد لي من تشغيل ما يصل خدمة بلدي IDS 9.40.xC7 (وقد صدر هذا حزمة الإصلاح في عام 2005، وكان الإصدار الأصلي على الأرجح في أواخر عام 2003) ...
والمشكلة الأولى - IDS 9.40 لا يسمح الاستعلامات الفرعية في عبارة FROM
.والمشكلة الثانية - IDS 9.40 لا يسمح "أول ن 'التدوين في أي من هذه السياقات:
SELECT FIRST 10 * FROM elements INTO TEMP e;
INSERT INTO e SELECT FIRST 10 * FROM elements;
والمشكلة الثالثة - IDS 9.40 لايوجد ROWNUM بسيط
وهكذا، كمحاولة للتغلب على هذه، ونحن يمكن أن يكتب (باستخدام جدول مؤقت - فسوف نلغي ذلك لاحقا):
SELECT e1.*
FROM elements AS e1, elements AS e2
WHERE e1.atomic_number >= e2.atomic_number
GROUP BY e1.atomic_number, e1.symbol, e1.name, e1.atomic_weight, e1.stable
HAVING COUNT(*) <= 10
INTO TEMP e;
SELECT *
FROM e INNER JOIN compound_component AS a
ON e.symbol = a.element
INNER JOIN compound AS c
ON c.compound_id = a.compound_id;
وهذا ينتج نفس الجواب كما الاستعلام واحد في IDS 11.50. يمكننا تجنب الجدول المؤقت؟ نعم، لكنه أكثر مطول:
SELECT e1.*, a.*, c.*
FROM elements AS e1, elements AS e2, compound_component AS a,
compound AS c
WHERE e1.atomic_number >= e2.atomic_number
AND e1.symbol = a.element
AND c.compound_id = a.compound_id
GROUP BY e1.atomic_number, e1.symbol, e1.name, e1.atomic_weight,
e1.stable, a.compound_id, a.element, a.seq_num,
a.multiplicity, c.compound_id, c.name
HAVING COUNT(*) <= 10;
وبتطبيق ذلك على الأوامر بالإضافة إلى الخطوط الترتيب الأصلي المثال تبقى باعتبارها ممارسة للقارئ.
وفرعية ذات الصلة من مخطط "جدول عناصر ':
-- See: http://www.webelements.com/ for elements.
-- See: http://ie.lbl.gov/education/isotopes.htm for isotopes.
CREATE TABLE elements
(
atomic_number INTEGER NOT NULL UNIQUE CONSTRAINT c1_elements
CHECK (atomic_number > 0 AND atomic_number < 120),
symbol CHAR(3) NOT NULL UNIQUE CONSTRAINT c2_elements,
name CHAR(20) NOT NULL UNIQUE CONSTRAINT c3_elements,
atomic_weight DECIMAL(8,4) NOT NULL,
stable CHAR(1) DEFAULT 'Y' NOT NULL
CHECK (stable IN ('Y', 'N'))
);
CREATE TABLE compound
(
compound_id SERIAL NOT NULL PRIMARY KEY,
name VARCHAR(100) NOT NULL UNIQUE
);
-- The sequence number is used to order the components within a compound.
CREATE TABLE compound_component
(
compound_id INTEGER REFERENCES compound,
element CHAR(3) NOT NULL REFERENCES elements(symbol),
seq_num SMALLINT DEFAULT 1 NOT NULL
CHECK (seq_num > 0 AND seq_num < 20),
multiplicity INTEGER NOT NULL
CHECK (multiplicity > 0 AND multiplicity < 20),
PRIMARY KEY(compound_id, seq_num)
);
والإخراج (على قاعدة بيانات نموذج بلدي):
1 H Hydrogen 1.0079 Y 1 H 1 2 1 water
1 H Hydrogen 1.0079 Y 3 H 2 4 3 methane
1 H Hydrogen 1.0079 Y 4 H 2 6 4 ethane
1 H Hydrogen 1.0079 Y 5 H 2 8 5 propane
1 H Hydrogen 1.0079 Y 6 H 2 10 6 butane
1 H Hydrogen 1.0079 Y 11 H 2 5 11 ethanol
1 H Hydrogen 1.0079 Y 11 H 4 1 11 ethanol
6 C Carbon 12.0110 Y 2 C 1 1 2 carbon dioxide
6 C Carbon 12.0110 Y 3 C 1 1 3 methane
6 C Carbon 12.0110 Y 4 C 1 2 4 ethane
6 C Carbon 12.0110 Y 5 C 1 3 5 propane
6 C Carbon 12.0110 Y 6 C 1 4 6 butane
6 C Carbon 12.0110 Y 7 C 1 1 7 carbon monoxide
6 C Carbon 12.0110 Y 9 C 2 1 9 magnesium carbonate
6 C Carbon 12.0110 Y 10 C 2 1 10 sodium bicarbonate
6 C Carbon 12.0110 Y 11 C 1 2 11 ethanol
8 O Oxygen 15.9990 Y 1 O 2 1 1 water
8 O Oxygen 15.9990 Y 2 O 2 2 2 carbon dioxide
8 O Oxygen 15.9990 Y 7 O 2 1 7 carbon monoxide
8 O Oxygen 15.9990 Y 9 O 3 3 9 magnesium carbonate
8 O Oxygen 15.9990 Y 10 O 3 3 10 sodium bicarbonate
8 O Oxygen 15.9990 Y 11 O 3 1 11 ethanol
نصائح أخرى
إذا فهمت سؤالك كنت تواجه مشكلة مع "TOP". حاول استخدام استعلام فوق-N.
وعلى سبيل المثال:
select *
from (SELECT *
FROM foo
where foo_id=[number]
order by foo_id desc)
where rownum <= 50
وهذا سوف تحصل على أعلى خمسين النتائج (لأنني تأمر تصاعدي في الاستعلام الفرعي)