0

8 つの異なる数値を取り、対応する値を 1 つのデータベースから 8 つの異なるテーブルで検索する SQL ステートメントを作成しようとしています。無効な構文が表示され続けますが、その理由がわかりません。これが私のコードです:

SELECT cable_length.ID, drawing.ID, optional.ID, output_type.ID, pressure_range.ID, pressure_type.ID, series.ID, termination.ID 
FROM
(
    SELECT value AS cable_length FROM A1 WHERE A1.id = %s
    JOIN SELECT value AS drawing FROM A2 WHERE A2.id = %s,
    JOIN SELECT value AS optional FROM A3 WHERE A3.id = %s,
    JOIN SELECT value AS output_type FROM A4 WHERE A4.id = %s,
    JOIN SELECT value AS pressure_range FROM A5 WHERE A5.id = %s,
    JOIN SELECT value AS pressure_type FROM A6 WHERE A6.id = %s,
    JOIN SELECT value AS series FROM A7 WHERE A7.id = %s, 
    JOIN SELECT value AS termination FROM A8 WHERE A8.id = %s
);

%s は数字のみに変更されます。各テーブルの列名は「ID」と「値」です。「ID」で検索して「値」を返したい。テーブル名はcable_lengthなどです。どんな助けでも大歓迎です。

4

3 に答える 3

2

8 つの値がすべて存在することがわかっている場合は、次のように結合できます。

SELECT  A1.value as cable_length
  , A2.value as drawing
  , A3.value as optional
  , A4.value as output_type
  , A5.value as pressure_range
  , A6.value as pressure_type
  , A7.value as series
  , A7.value as termination
FROM A1, A2, A3, A4, A5, A6, A7, A8
WHERE A1.ID = %s
  AND A2.ID = %s
  AND A3.ID = %s
  AND A4.ID = %s
  AND A5.ID = %s
  AND A6.ID = %s
  AND A7.ID = %s
  AND A8.ID = %s

これがわからないが、最初の値が存在することが保証されている場合は、左結合が必要になるため、クエリが醜くなる必要があります。

SELECT  A1.value as cable_length
  , A2.value as drawing
  , A3.value as optional
  , A4.value as output_type
  , A5.value as pressure_range
  , A6.value as pressure_type
  , A7.value as series
  , A7.value as termination
FROM A1
  LEFT JOIN A2
    ON A2.ID = %s
  LEFT JOIN A3
    ON A3.ID = %s
  LEFT JOIN A4
    ON A4.ID = %s
  LEFT JOIN A5
    ON A5.ID = %s
  LEFT JOIN A6
    ON A6.ID = %s
  LEFT JOIN A7
    ON A7.ID = %s
  LEFT JOIN A8
    ON A8.ID = %s
WHERE A1.ID = %s

どの値も存在することが保証されていない場合、ハックは、UNION ALL1 つだけが入力された 8 つの列を返す of 8 クエリであるサブクエリを作成しMAX、各列の をその列名として選択することです。

これは、たまにしか結合しない多くの左結合によるパフォーマンスの問題を回避するために、私が過去に使用したひどいトリックです。

ちなみに、A1..A8 という名前の 8 つのテーブルは、データベースの経験が豊富な人が設計を調べて、より良いレイアウトを提供する必要があることを示唆しています。

于 2012-06-27T15:01:01.623 に答える
0

UNION ALL will work in this case, but it may not be the best solution, not to mention the mess (see the answer provided by @btilly). Also note that this is SQL Server syntax, which may differ slightly to MySql

select max(cable_length), max(drawing), max(optional), max(output_type), max(pressure_range), max(pressure_type), max(series), max(termination)

from
(
    SELECT value as cable_length, null, null, null, null, null, null, null, null 
    FROM cable_length WHERE id = %s

    UNION ALL

    SELECT null, value as drawing, null, null, null, null, null, null, null 
    FROM drawing WHERE id = %s

    UNION ALL

    SELECT null, null, value as optional, null, null, null, null, null, null 
    FROM optional WHERE id = %s

    UNION ALL

    SELECT null, null, null, value as output_type, null, null, null, null, null 
    FROM output_type WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, value as pressure_range, null, null, null 
    FROM pressure_range WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, null, value as pressure_type, null, null 
    FROM pressure_type WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, null, null, value as series, null 
    FROM series WHERE id = %s

    UNION ALL

    SELECT null, null, null, null, null, null, null, value as termination 
    FROM termination WHERE id = %s
);
于 2012-06-27T15:12:10.543 に答える
0

多分これはあなたが望むものです。そうではないかもしれませんが、クエリを書き直しました:

SELECT
  cable_length.ID,
  drawing.ID,
  optional.ID,
  output_type.ID,
  pressure_range.ID,
  pressure_type.ID,
  series.ID,
  termination.ID 
FROM (SELECT ID FROM A1 WHERE A1.id = %s) AS cable_length
JOIN (SELECT ID FROM A2 WHERE A2.id = %s) AS drawing
JOIN (SELECT ID FROM A3 WHERE A3.id = %s) AS optional
JOIN (SELECT ID FROM A4 WHERE A4.id = %s) AS output_type
JOIN (SELECT ID FROM A5 WHERE A5.id = %s) AS pressure_range
JOIN (SELECT ID FROM A6 WHERE A6.id = %s) AS pressure_type
JOIN (SELECT ID FROM A7 WHERE A7.id = %s) AS series
JOIN (SELECT ID FROM A8 WHERE A8.id = %s) AS termination;
于 2012-06-27T15:01:57.253 に答える