簡體   English   中英

來自八個表的多個JOIN和SELECT語句

[英]Multiple JOIN and SELECT Statements from eight tables

我正在嘗試創建一個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”搜索並返回“Value”。 表名是cable_length等。非常感謝任何幫助。

如果您知道所有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

如果沒有任何值保證存在,那么hack將是一個子查詢,它是一個UNION ALL的8個查詢,返回8個列,只有一個填充,然后選擇每列的MAX作為該列名。

這是一個非常糟糕的技巧,我過去用來避免許多只偶爾加入的左連接的性能問題。

順便說一句,名為A1..A8的8個表表明,您需要具有數據庫經驗的人來查看您的設計並為您提供更好的布局。

也許這就是你想要的。 也許不是,我只是重寫了你的查詢:

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;

UNION ALL將在這種情況下工作,但它可能不是最好的解決方案,更不用說亂七八糟了(參見@btilly提供的答案)。 另請注意,這是SQL Server語法,可能與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
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM