我想知道是否有人找到解决这个问题的巧妙方法。我试图从几个表中选择数据,让记录逐行匹配。我基本上追求的是完整的外部连接,但有一个关键的区别。如果我在一个表中连接的列中有四行具有特定值,而另一个表中有三行具有该值,我只希望连接前三个结果,第四个结果就像有一直不匹配。
这样做的原因是创建一个对账报告,以确保在比较结果时不会多次计算交易。我可以通过使用一些分组和一些聚合函数来解决这个问题,但这隐藏了我想保留的一些细节。
下面是一个示例,展示了我所追求的东西,注释中的无效/伪代码说明了我如何认为这是有效的:
declare @t1 table (id bigint identity(1,1) primary key clustered, foreignKeyId bigint, otherData nvarchar(10))
declare @t2 table (id bigint identity(1,1) primary key clustered, foreignKeyId bigint, moreData nvarchar(10))
insert @t1 select 1, '1.1.1'
union all select 1, '1.1.2'
union all select 1, '1.1.3'
union all select 3, '1.3.1'
union all select 3, '1.3.2'
union all select 3, '1.3.3'
union all select 4, '1.4.3'
insert @t2 select 1, '2.1.1'
union all select 1, '2.1.2'
union all select 1, '2.1.3'
union …Run Code Online (Sandbox Code Playgroud) 任何人都可以帮我解决以下查询..
这里我们有 1. 左外连接 2. 两个右外连接
如何组合左右 OJ 并创建与上述相同的效果,
我需要重写相同的查询,这是因为我是我们的老MS SQL2009转换成MS SQL2012 ..而在2012年*=,=*不支持。
SELECT X.master_key, X.vendor_code
FROM
X, Y, X x2
WHERE Y.master_key = X.parent_key
AND Y.master_key *= x2.parent_key
AND x2.INITIALS =* Y.DEFAULT_INITIALS
AND x2.VENDOR_CODE =* Y.VENDOR_ABBREV
AND Y.project_name = 'TEST'
Run Code Online (Sandbox Code Playgroud)
我已经用我的基本知识修改了上面的代码,如下所示,但根本不起作用
SELECT X.master_key, X.vendor_code
FROM
X,
Y left outer join X x2
on Y.master_key = x2.parent_key,
X vnd RIGHT OUTER JOIN Y vnm
(on vnd.INITIALS = vnm.DEFAULT_INITIALS AND vnd.VENDOR_CODE = vnm.VENDOR_ABBREV )
WHERE Y.master_key = …Run Code Online (Sandbox Code Playgroud) 想象一下以下两个表,分别命名为“Users”和“Orders”:
ID NAME
1 Foo
2 Bar
3 Qux
ID USER ITEM SPEC TIMESTAMP
1 1 12 4 20150204102314
2 1 13 6 20151102160455
3 3 25 9 20160204213702
Run Code Online (Sandbox Code Playgroud)
我想要得到的输出是:
USER ITEM SPEC TIMESTAMP
1 12 4 20150204102314
2 NULL NULL NULL
3 25 9 20160204213702
Run Code Online (Sandbox Code Playgroud)
换句话说:在用户和订单之间执行 LEFT OUTER JOIN,如果您没有找到该用户的任何订单,则返回 null,但如果找到一些,则仅返回第一个订单(基于时间戳的最早订单) 。
如果我只使用 LEFT OUTER JOIN,它将为用户 1 返回两行,我不希望这样。我想过将 LEFT OUTER JOIN 嵌套在另一个选择中,该选择将按其他字段进行分组并获取 MIN(TIMESTAMP) 但这也不起作用,因为我需要在我的分组依据中包含“SPEC”,并且因为这两个订单有不同的规格,它们仍然都出现。
任何有关如何实现预期结果的想法都将受到赞赏。
我在 pandas 中有两个数据框,如下所示。EmpID 是两个数据帧中的主键。
df_first = pd.DataFrame([[1, 'A',1000], [2, 'B',np.NaN],[3,np.NaN,3000],[4, 'D',8000],[5, 'E',6000]], columns=['EmpID', 'Name','Salary'])
df_second = pd.DataFrame([[1, 'A','HR','Delhi'], [8, 'B','Admin','Mumbai'],[3,'C','Finance',np.NaN],[9, 'D','Ops','Banglore'],[5, 'E','Programming',np.NaN],[10, 'K','Analytics','Mumbai']], columns=['EmpID', 'Name','Department','Location'])
Run Code Online (Sandbox Code Playgroud)
我想用 EmpID 连接这两个数据框,以便
我使用下面的代码来实现这一点。
merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID'])
Run Code Online (Sandbox Code Playgroud)
但这段代码给了我我不想要的重复列,因此我只使用两个表中的唯一列进行合并。
ColNames = list(df_second.columns.difference(df_first.columns))
ColNames.append('EmpID')
merged_df = pd.merge(df_first,df_second,how='outer',on=['EmpID'])
Run Code Online (Sandbox Code Playgroud)
现在我没有得到重复的列,但在键匹配的观察中也没有得到价值。
如果有人能帮助我,我将非常感激。
问候, 凯拉什·内吉
我可以在sybase中完成它,我可以在oracle中完成它,但我没有看到如何在mysql中完成它.
我有这个:(请限制自己重新格式化我的sql,上次有人这样做,他们改变它,所以它不一样,使问题毫无意义)
select table1.id
from
table1
inner join
table2 on (table1.id = table2.id and table2.data='cat'),
table1 t1
left outer join
table3 on (t1.id = table3.id and table3.data = 'dog')
Run Code Online (Sandbox Code Playgroud)
而且我得到了各种没有意义的结果.
我想得到table1中所有id的列表,其中table2.data = cat,然后对表3执行外连接,其中table3.data = dog.
我注意到我不能在两个join子句中为table1指定相同的表/别名,因此这让我相信mysql分别运行连接表达式并将结果OR运算在一起或类似的东西.
我也尝试摆脱from部分中的"内部联接"并将其放在where子句中,这也不起作用,尽管它不能以不同的方式工作(得到不同的错误结果)
这在sybase或oracle中会非常容易.
我究竟做错了什么?
这是一个示例表来帮助说明我的问题:
mysql> select * from test;
+----+--------------+--------+
| id | type | siteid |
+----+--------------+--------+
| 1 | First Visit | 100 |
| 2 | Second Visit | 100 |
| 3 | First Visit | 300 |
| 4 | First Visit | 400 |
| 5 | Second Visit | 500 |
| 6 | Second Visit | 600 |
+----+--------------+--------+
Run Code Online (Sandbox Code Playgroud)
我正在尝试将表连接到自身,将具有相同siteid值的行组合在一起.这是我的尝试:
mysql> select * from test T1
-> LEFT OUTER JOIN test T2 on T1.siteid = …Run Code Online (Sandbox Code Playgroud) 我有2个表,我需要运行查询
Table1有2个字段:l_id和name
表2还有2个字段:l_id和b_id
我需要运行一个查询来获取table1中所有条目的"name"和"l_id",这些条目在table2中没有给定b_id的条目.
希望这有一定道理
码:
outerMethod {
@Override
public void run() {
innerMethod throws IOException
}
}
Run Code Online (Sandbox Code Playgroud)
在线程中抛出的方法抛出已检查的异常 - IOException.我需要在主线程中处理此异常.喜欢:
outerMethod() throws IOException
{
@Override
public void run() {
innerMethod() throws IOException
}
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?如果不是,那么更好的方法是什么?
谢谢.
我正在寻找一种快速的方法来做"不加入"(即保持不合并的行,或内部联接的反向).我一直在做的方法是使用data.table for X和Y,然后设置key.例如:
require(data.table)
X <- data.table(category = c('A','B','C','D'), val1 = c(0.2,0.3,0.8,0.7))
Y <- data.table(category = c('B','C','D','E'), val2 = c(2,3,5,7))
XY <- merge(X,Y,by='category')
> XY
category val1 val2
1: B 0.3 2
2: C 0.8 3
3: D 0.7 5
Run Code Online (Sandbox Code Playgroud)
但我需要反过来,所以我必须这样做:
XY_All <- merge(X,Y,by='category',all=TRUE)
setkey(XY,category)
setkey(XY_All,category)
notXY <- XY_All[!XY] #data.table not join (finally)
> notXY
category val1 val2
1: A 0.2 NA
2: E NA 7
Run Code Online (Sandbox Code Playgroud)
我觉得这很长篇大论(特别是来自data.frame).我错过了什么吗?
编辑:我在考虑了更多关于不加入之后得到了这个
X <- data.table(category = c('A','B','C','D'), val1 = c(0.2,0.3,0.8,0.7),key = "category")
Y <- …Run Code Online (Sandbox Code Playgroud) 我有两个数据集,我想要的可能被宽泛地称为"非关键变量的外连接".
这是数据集
数据集1
oc oc2 state_id r_state
A011 A01 1808 1.00
A011 A01 1810 0.50
A012 A01 1810 0.50
A011 A01 1814 0.33
A012 A01 1814 0.33
A013 A01 1814 0.33
Run Code Online (Sandbox Code Playgroud)
数据集2
oc r_country
A011 0.62
A012 0.14
A013 0.24
Run Code Online (Sandbox Code Playgroud)
我想要的输出如下:
oc oc2 state_id r_state r_country
A011 A01 1808 1.00 0.62
A012 A01 1808 NA 0.14
A013 A01 1808 NA 0.24
A011 A01 1810 0.50 0.62
A012 A01 1810 0.50 0.14
A013 A01 1810 NA 0.24
A011 A01 1814 0.33 …Run Code Online (Sandbox Code Playgroud) outer-join ×10
join ×4
sql ×4
sql-server ×3
data.table ×2
inner-join ×2
merge ×2
mysql ×2
r ×2
exception ×1
group-by ×1
java ×1
left-join ×1
methods ×1
oracle ×1
pandas ×1
python ×1
python-3.x ×1
select ×1