我有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返回所有结果?
由于
答案 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