我试图比较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 1
和Table 2
中找不到Table 3
中的ID。在我的子查询中,我比较Table 2
和Table 3
,其中Table 2
优先于Table 3
,因此如果Table 2
中Status = 2
存在ChargeItemID Table1
然后获取它并返回其ID以及Table 1
目前它不会返回Table1
的任何ID?有什么建议吗?
结果应该是从5055
5056
,
5057
,
5059
,
5061
,
5064
,
T2.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
查询的预期结果
答案 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
提供给Table2
和Table3
的列没有加入。这样,您只需要对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评论,您希望IDs
和Table2
都不提供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 2
和table 3
的结果进行比较,以获得最终列表。
SELECT id FROM table1
except
SELECT chargeitemid FROM table3
except
SELECT chargeitemid FROM table2 WHERE membershiprecordid = 268765 AND status = 2