SQL Server:将2个SELECTS与JOIN组合在一起

时间:2017-05-02 14:14:33

标签: sql sql-server join sql-server-2014

我试图在一次调用中获得2组查询,但我似乎无法正确理解。

我打电话的数据是:

enter image description here

每个表的查询是:

SELECT 
    * 
FROM 
    tT 
WHERE 
    active = 1 
    AND ADate BETWEEN '01/03/2011' AND '09/01/2012' 
    AND (RID = 0...etc etc....

AND

SELECT 
    * 
FROM 
    tE 
WHERE 
    active = 1  
    AND  (RID = 0...etc etc...

我尽力将它们结合起来:

SELECT * 
FROM
    (SELECT * 
     FROM tT 
     WHERE active = 1  
       AND ADate BETWEEN '01/03/2011' AND '09/01/2012' 
       AND (RID = 0...etc etc..
JOIN
    (SELECT * 
     FROM tE 
     WHERE active = 1 
       AND (RID = 0...etc etc...  ) ON tT.RID = tE.RId

但是当它应该是(22)的两倍时,它只返回11行。

如何将两者结合起来并获得完整的22行?

4 个答案:

答案 0 :(得分:0)

如果您只想结合两个查询的结果,只需在两个查询上执行联合。

SELECT * FROM tT WHERE active = 1 AND ADate BETWEEN '01/03/2011' AND '09/01/2012' AND (RID = 0...etc etc..
UNION ALL
SELECT * FROM tE WHERE active = 1 AND (RID = 0...etc etc...

如果您不想包含重复记录,请从union语句中删除“ALL”,并且只返回唯一记录。

答案 1 :(得分:0)

如果您只想组合2个表中的数据而不是使用union。

SELECT * 
FROM   tT 
WHERE  active = 1 
AND    ADate BETWEEN '01/03/2011' AND '09/01/2012' 
AND    (RID = 0...etc etc..

UNION ALL

SELECT * 
FROM   tE 
WHERE  active = 1 
AND    (RID = 0...etc etc...

但是,只有当两个表具有完全相同的字段且完全相同的类型时,这才有效。

如果情况并非如此,请选择*但是您应该命名,如果需要,请转换您的字段... 例如:(不知道你的字段,我只是采用了一些随机名称)

SELECT tT.ID, tT.Field1, tT.TypeID
FROM   tT 
WHERE  active = 1 
AND    ADate BETWEEN '01/03/2011' AND '09/01/2012' 
AND    (RID = 0...etc etc..

UNION ALL

SELECT tE.KeyID as ID, tE.Field2 as Field1, convert(int, tE.TypeCode) as TypeID
FROM   tE 
WHERE  active = 1 
AND    (RID = 0...etc etc...

修改
如果两个表都不匹配,则必须更具创意。
例如:
tT具有字段ID int,Field1 int,Field2 varchar(10)和Field3 int
tE具有字段ID int,field4 int,field5 varchar(10)和Field6 datetime

内容将是例如:

tT
ID     Field1    Field2    Field3
--     ------    ------    ------
1      30        test      40

tE
ID     Field4    Field5    Field6
--     ------    ------    ------
2      50        hello     30/04/2017

结果应该是

ID     Field1    Field2    Field3    Field6
--     ------    ------    ------    ------
1      30        test      40        
2      50        hello               30/04/2017

查询不是

SELECT tT.ID, tT.Field1, tT.Field2, tT.Field3, null as Field6
FROM   tT 
WHERE  active = 1 
AND    ADate BETWEEN '01/03/2011' AND '09/01/2012' 
AND    (RID = 0...etc etc..

UNION ALL

SELECT tE.KeyID as ID, tE.Field4 as Field1, tE.Field5 as Field2, null as Field3, tE.Field6
FROM   tE 
WHERE  active = 1 
AND    (RID = 0...etc etc...

如果您愿意分享您的桌面设计,我可以进行更符合您需求的查询......

答案 2 :(得分:0)

希望这是你想要做的事情

CREATE TABLE #Test(
RowID INT IDENTITY(1,1),
Texts VARCHAR(50)
)
GO

CREATE TABLE #Test1(
RowID INT IDENTITY(1,1),
Numb  INT
)
GO

INSERT INTO #Test VALUES ('Test')
INSERT INTO #Test VALUES ('Best')
GO

INSERT INTO #Test1 VALUES (34)
INSERT INTO #Test1 VALUES (35)
GO

SELECT * FROM 
(SELECT * FROM #Test )T
JOIN
(SELECT * FROM #Test1)T1
ON T.RowID = T1.RowID

答案 3 :(得分:0)

如果我在查询后正确理解问题应该有效 假设你有 col1& 表格tT 中的col3 ,而 col1& table tE 中的col2 然后你应该使用null,就像不存在的列一样

$(function() {

  $('p').click(function(){
        $(this).next('p').show();
  });

});

如果不需要别的东西,请告诉我。