الاستعلامات الفرعية ينفورميكس مع الخيار الأول

StackOverflow https://stackoverflow.com/questions/1033729

  •  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

وهذا سوف تحصل على أعلى خمسين النتائج (لأنني تأمر تصاعدي في الاستعلام الفرعي)

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top