【问题标题】:Multiple joins to same table多个连接到同一个表
【发布时间】:2011-06-15 06:54:36
【问题描述】:

我有这组表格和数据

CREATE TABLE item (  
    id INT PRIMARY KEY,  
    name VARCHAR  
);  
CREATE TABLE property (  
    id INT PRIMARY KEY,  
    name VARCHAR  
);  
CREATE TABLE value (  
    id INT PRIMARY KEY,  
    value VARCHAR  
);  
CREATE TABLE item_value (  
    item INT NOT NULL REFERENCES item(id),  
    property INT NOT NULL REFERENCES property(id),  
    value INT NOT NULL REFERENCES value(id)  
);  
INSERT INTO item (id, name) VALUES (1, 'item1'), (2, 'item2');  
INSERT INTO property (id, name) VALUES (1, 'prop1'), (2, 'prop2');  
INSERT INTO value (id, value) VALUES (1, 'val1'), (2, 'val2');  
INSERT INTO item_value (item, property, value) VALUES (1, 1, 1), (2,2,2 );  

我想得到一个结果集:

name    value_1    value_2
---------------------------  
item1   val1       <null>
item2   <null>     val2

我使用查询:

SELECT i.name as name, v1.value as value_1, v2.value as value_2 
FROM item i
LEFT JOIN item_value iv ON iv.item = i.id
LEFT JOIN value v1 ON v1.id = iv.value AND v1.id = (
  SELECT v.id FROM value v 
  JOIN property p ON p.id = iv.property 
    AND p.name = 'prop1' AND v.id = v1.id AND v.id = iv.value
)
LEFT JOIN value v2 ON v2.id = iv.value AND v2.id = (
  SELECT v.id FROM value v 
  JOIN property p ON p.id = iv.property 
    AND p.name = 'prop2' AND v.id = v2.id AND v.id = iv.value
)

问题是:如何避免嵌套选择?
我正在使用 Postgresql

【问题讨论】:

    标签: sql postgresql join


    【解决方案1】:

    你可以试试

    SELECT i.name as name, v1.value as value_1, v2.value as value_2 
      FROM item i
           INNER JOIN item_value iv ON iv.item = i.id
           INNER JOIN property p ON iv.property = p.id
           LEFT JOIN value v1 ON p.name = 'prop1' AND v1.id = iv.value
           LEFT JOIn value v2 ON p.name = 'prop2' AND v2.id = iv.value
    

    【讨论】:

      猜你喜欢
      • 2018-12-19
      • 2018-07-06
      • 2012-04-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-07
      • 1970-01-01
      • 2021-06-22
      相关资源
      最近更新 更多