SQL 2表始终返回1个表匹配中存在的所有行

时间:2011-06-16 21:55:56

标签: sql

我有2张桌子。

Table1
Id
1
2
3
4

    Table2
VehicleId Value Table1Id
    1      t      1
    1      q      2
    3      w      3
    3      e      4
    4      t      1
    5      e      1
    5      f      2
    5      g      4

如何获取它,以便它始终返回第一个表的Id 1-4,然后如果它们存在于表2中则加入值。

例如,结果集将为:

VehicleId  Value
    1        t
    1        q
    1    
    1  
    3         w
    3         e
    3
    3

所以即使表2中没有值,我总是希望从表1返回所有结果?

由于

3 个答案:

答案 0 :(得分:2)

我没有看到您的示例输出如何与您提供的示例数据匹配 - 是否意味着?

但我认为你所需要的只是一个LEFT JOIN ......

SELECT Table2.VehicleId, Table2.Value
FROM Table1
LEFT JOIN Table2 ON Table1.Id = Table2.Table1Id;

答案 1 :(得分:0)

试试这个

SELECT TAB1.Id,
TAB2.VehicleId,
TAB2.Value
FROM Table1 TAB1 LEFT JOIN Table2 TAB2 ON TAB1.Id = TAB2.Table1Id

答案 2 :(得分:0)

由于您的Table2不是真正的“车辆”表,因此出现了问题。因为VehicleId不唯一地标识该表中的记录。这就是所有混乱的来源。所以为了解决这个问题并让你的问题发挥作用,我在table2上对表1中的值做了一个select distinct(为了清晰起见,我也做了一个select,但是没有必要。)希望这会有所帮助。

CREATE TABLE #Table1 (Id INT)
CREATE TABLE #Table2 (VehicleID INT, Value VARCHAR(50), Table1ID INT)

INSERT INTO #Table1 VALUES (1),(2),(3),(4),(5)
INSERT INTO #Table2 VALUES (1, 't', 1),(1, 'q', 2),(3, 'w', 3),(3, 'e', 4),(4, 't', 1),(5, 'e', 1),(5, 'f', 2),(5, 'g', 4)

SELECT * FROM #Table1
SELECT * FROM #Table2

SELECT  t2.VehicleID, t2.Value
FROM    ( SELECT    t2.VehicleId, t1.Id
          FROM      ( SELECT DISTINCT
                                VehicleId
                      FROM      #Table2 ) t2
                    CROSS JOIN ( SELECT Id
                                 FROM   #Table1 ) t1 ) Base
        LEFT JOIN #Table2 t2
            ON Base.VehicleId = t2.VehicleID
               AND Base.Id = t2.Table1ID
WHERE (Base.VehicleId BETWEEN 1 AND 3)

DROP TABLE #Table1
DROP TABLE #Table2