比较3个SQL表

时间:2017-04-07 12:23:20

标签: sql sql-server

我试图比较3个表,其中1个是基表。

所以这是我的3个表,其中表1是基表,另外两个是相互比较的。

Table1
ID   | ChargeItem
-----------------
5055 | Item1
5056 | Item2
5057 | Item3
5058 | Item4
5059 | Item5
5060 | Item6
5061 | Item7
5062 | Item8
5063 | Item9
5064 | Item10
5065 | Item11

Table2                                         
ID | membershiprecordid | ChargeItemID | Status
-----------------------------------------------
1  | 268765             | 5060         | 1     
2  | 268765             | 5060         | 1     

Table3
ID    | ChargeItemID
--------------------
12146 | 5058
12146 | 5060
12146 | 5062
12146 | 5063
12146 | 5065

到目前为止,这是我的SQL查询

SELECT Table1.ID
FROM Table1 as T1 
WHERE T1.ID NOT in (
     select Table2.chargeitemid from Table2 as T2 
     right join Table3 as T3 on T2.chargeitemid = T3.chargeitemid
     where T2.membershiprecordid = 268765 AND T2.[Status] = 2
)

所以在SQL查询中,我试图从Table 1Table 2中找不到Table 3中的ID。在我的子查询中,我比较Table 2Table 3,其中Table 2优先于Table 3,因此如果Table 2Status = 2存在ChargeItemID Table1然后获取它并返回其ID以及Table 1

中的ID

目前它不会返回Table1的任何ID?有什么建议吗?

结果应该是从5055

返回的以下ChargeItem ID

50565057505950615064T2.ClubID = 1600

希望它能解释我的问题?

由于

更新

请忽略错误发布的class OutReturnExample { static void Method(out int i, out string s1, out string s2) { i = 44; s1 = "I've been returned"; s2 = null; } static void Main() { int value; string str1, str2; Method(out value, out str1, out str2); // value is now 44 // str1 is now "I've been returned" // str2 is (still) null; } }

更新2

查询的预期结果

6 个答案:

答案 0 :(得分:1)

尝试使用以下查询来查找表1中存在且在表2和表2中不存在的ID。表3。

    CREATE TABLE TABLE1 (ID INT);
    INSERT INTO TABLE1 VALUES (5055), (5056), (5060), (5065), (5057);

    CREATE TABLE TABLE2 (ID INT, CHARGEITEMID INT, STATUS INT)
    INSERT INTO TABLE2 VALUES (1, 5060,1)
    INSERT INTO TABLE2 VALUES (2, 5065,1)
    INSERT INTO TABLE2 VALUES (2, 5056,2)

    CREATE TABLE TABLE3 (ID INT, CHARGEITEMID INT )
    INSERT INTO TABLE3 VALUES (1, 5058)
    INSERT INTO TABLE3 VALUES (1, 5060)
    INSERT INTO TABLE3 VALUES (1, 5062)
    INSERT INTO TABLE3 VALUES (1, 5063)
    INSERT INTO TABLE3 VALUES (1, 5065)
    INSERT INTO TABLE3 VALUES (1, 5056)


    select * from TABLE1
    select * from TABLE2
    select * from TABLE3

    select id
    from TABLE1
    except
    (
        select CHARGEITEMID from TABLE2
        intersect
        select CHARGEITEMID from TABLE3
    )

答案 1 :(得分:0)

你能看出这是否能完成你的要求(也许我没有理解它):

componentWillMount() {  
  this.props.handleSubmit(() => ({}));
}

示例数据:

SELECT T1.ID
FROM Table1 as T1 
LEFT JOIN (select DISTINCT T3.chargeitemid, T2.STATUS
           from Table2 as T2 
           right join Table3 as T3 on T2.chargeitemid = T3.chargeitemid
           ) T4 ON T1.ID = T4.CHARGEITEMID
WHERE T4.chargeitemid IS NULL 
     OR T4.Status = 2 

输出:

CREATE TABLE TABLE1 (ID INT);
INSERT INTO TABLE1 VALUES (5055), (5056), (5060), (5065), (5057);
CREATE TABLE TABLE2 (ID INT, CHARGEITEMID INT, STATUS INT)
INSERT INTO TABLE2 VALUES (1, 5060,1)
INSERT INTO TABLE2 VALUES (2, 5065,1)
INSERT INTO TABLE2 VALUES (2, 5056,2)
CREATE TABLE TABLE3 (ID INT, CHARGEITEMID INT )
INSERT INTO TABLE3 VALUES (1, 5058)
INSERT INTO TABLE3 VALUES (1, 5060)
INSERT INTO TABLE3 VALUES (1, 5062)
INSERT INTO TABLE3 VALUES (1, 5063)
INSERT INTO TABLE3 VALUES (1, 5065)
INSERT INTO TABLE3 VALUES (1, 5056)

答案 2 :(得分:0)

您可以使用left join执行此操作,这将保留Table1中的所有行,并将null提供给Table2Table3的列没有加入。这样,您只需要对null

这些字段进行过滤
select  t1.id
from    Table1 t1
left join
        Table2 t2
on      t1.ID = t2.ChargeItemID and
        t2.membershiprecordid = 268765 and
        t2.[Status] = 2
left join
        Table3 t3
on      t1.ID = t3.ChargeItemID
where   t2.ChargeItemID is null or
        t3.ChargeItemID is null

如果根据@BeanFrog评论,您希望IDsTable2都不提供Table3,则可以将OR替换为{{1}在AND子句中。

修改

似乎我误解了要求,这个应该做的伎俩

where

这将返回不在t3中或在t3和t2中的ID(应用了t2过滤器);你可以在行动中看到它here

答案 3 :(得分:0)

尝试使用不存在,像这样

    select T1.ID as cid
  from Table1 as T1
 where not exists (select 1 from Table2 as T2 where T2.chargeitemid = T1.ID)
   and not exists
 (select 1 from Table3 as T3 where T3.chargeitemid = T1.ID)
union all
select T2.chargeitemid as cid
  from Table2 as T2
 right join Table3 as T3 on T2.chargeitemid = T3.chargeitemid
 where T2.membershiprecordid = 268765
   and T2.Status = 2

答案 4 :(得分:0)

一些事情:

  • 您提到:“表2优先于表3”。如果您正在执行RIGHT JOIN,那么您基本上就是表示应该显示表3的行,而不管表2中是否存在匹配。这里,“RIGHT”表示您要加入的表,即表3。

  • 当你包含一个WHERE子句和一个RIGHT JOIN时,你实际上是否定了RIGHT JOIN并将此查询转换为INNER JOIN。这是什么意思?您的查询将在指定的列上加入,然后筛选整个搜索集以匹配您的WHERE子句。

  • 如果您希望表2中的所有列在与WHERE子句凭据匹配时显示,而不管表是否可以连接到表3,您需要将子查询更改为:

    SELECT Table2.chargeitemid from Table2 as T2 
    LEFT JOIN Table3 as T3 
    ON T2.chargeitemid = T3.chargeitemid
        AND T2.clubid = 1600 
        AND T2.membershiprecordid = 268765 
        AND T2.[Status] = 2
    

此查询将返回表2中满足(T2.clubid = 1600 ...)的所有列,显示表3中的列 if chargeitemid匹配。这将完成“表2优先于表3。”

此外,您的子查询(WHERE T1.ID中的查询不在其中)是否会返回预期结果?我可以根据需要更新这篇文章。

答案 5 :(得分:0)

最后通过使用SQL Except解决了这个问题,如下所示。因此,在查询中,它首先查询主表并获取所有id。然后,我将结果与table 2table 3的结果进行比较,以获得最终列表。

SELECT id FROM table1
except
SELECT chargeitemid FROM table3
except
SELECT chargeitemid FROM table2 WHERE membershiprecordid = 268765 AND status = 2