大家好,我有一个查询,基本上选择我们用户使用的最新浏览器.
这是我们的(简化)表结构
HITS_TABLE
----------
USERID
BROWSER
HITSDATE
USER_TABLE
----------
USERID
USERNAME
Run Code Online (Sandbox Code Playgroud)
这是我如何查询用户使用的最新浏览器
SELECT U.*, H.BROWSER
FROM USER_TABLE U
CROSS APPLY
(SELECT TOP 1 BROWSER
FROM HITS_TABLE
WHERE HITS_TABLE.USERID = U.USERID
ORDER BY HITS_TABLE.HITSDATE DESC
)as H
Run Code Online (Sandbox Code Playgroud)
几天前刚刚添加了HITS_TABLE.
因此,该查询只是在我们添加HITS_TABLE后访问我们网站的结果,并消除了其他用户.
以下是示例案例
USER_TABLE
-------------------
USERID USERNAME
-------------------
1 'Spolski'
2 'Atwoord
3 'Dixon'
HITS_TABLE
------------------------------
USERID HITSDATE BROWSER
------------------------------
2 15/8/2009 'Firefox 3.5'
1 16/8/2009 'IE 6'
2 16/8/2009 'Chrome'
Run Code Online (Sandbox Code Playgroud)
这是样本结果
------------------------------
USERID USERNAME BROWSER
------------------------------
1 'Spolsky' 'IE 6'
2 'Atwoord' 'Chrome' …Run Code Online (Sandbox Code Playgroud) SELECT WO_BreakerRail.ID, indRailType.RailType, indRailType.RailCode, WO_BreakerRail.CreatedPieces, WO_BreakerRail.OutsideSource, WO_BreakerRail.Charged, WO_BreakerRail.Rejected, WO_BreakerRail.RejectedToCrop, WO_BreakerRail.Date
FROM indRailType LEFT OUTER JOIN
WO_BreakerRail ON indRailType.RailCode = WO_BreakerRail.RailCode AND WO_BreakerRail.Date = @date
Run Code Online (Sandbox Code Playgroud)
返回时,Date列中有NULL值,其中没有来自WO_BreakerRail的匹配行.有没有办法用@date替换那些NULL值?
根据Google搜索:由于MySQL不支持完全外连接,因此可以通过union和/或union all进行模拟.但这两者要么删除真正的重复,要么显示虚假的重复.
什么是正确有效的方法?
这个问题似乎很有意义,但无法得到答案.
我有这样的查询:
select a1.name, b1.info
from (select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)
Run Code Online (Sandbox Code Playgroud)
我只想包含a1.status = 1的所有内容,因为我正在使用外连接,所以我不能只where为table1 添加一个约束,因为我想要排除的table2中的所有信息仍然存在,只是没有名字.我在想这样的事情:
select z1.name, z1.info
from ((select name, id, status
from table1 a) as a1
right outer join (select id, info
from table2 b) as b1 on (a1.id = b1.id)) as z1
where z1.status = 1
Run Code Online (Sandbox Code Playgroud)
但我不认为这是合法的.
编辑:如下所述,外连接实际上对我正在尝试做的事情没有意义.例如,如果我想要table2中的所有数据,其中table1中的status!= 1,包括table1中根本不存在相应ID的所有数据,该怎么办?因此,我需要来自table2的所有数据的外部联接,但仍希望排除status = 1的那些条目.
相当于:
select z1.name, z1.info
from ((select …Run Code Online (Sandbox Code Playgroud) 多年来我一直在使用Oracle.现在我使用mysql并且在MySQL中找不到外连接的非ansi版本/速记版本.
在oracle我能做到这一点
select a.country acountry,
a.stateProvince aStateProvince,
b.countryName bcountry,
b.name bstateProvince
from User a,
stateprovince b
where a.country*=b.countryName **(+)**
and a.stateProvince*=b.name **(+)**
Run Code Online (Sandbox Code Playgroud)
获得外部联接.mysql可以做类似的事吗?
我正在将客户端的软件数据库从Oracle迁移到PostgreSQL,我在理解查询,它做了什么以及如何迁移它时遇到了一些麻烦.
查询是:
SELECT *
FROM TBL1, TBL2, TBL3, TBL4
WHERE TBL3.Project_ID = TBL1.Project_ID
AND TBL2.Type_ID = TBL1.Type_ID
AND TBL4.PROPERTY_NAME(+)='Id'
AND TBL4.Entity_ID(+)=TBL1.Entity_ID
Run Code Online (Sandbox Code Playgroud)
而我得不到的部分是'Id'上的外连接(+).表上的连接,OK,但是在字符串上?我不知道它做了什么.
有人有想法吗?谢谢.
我有四张桌子:
表A:
ID | B_ID
----------
1 | 5
2 | 6
3 | 7
4 | 8
Run Code Online (Sandbox Code Playgroud)
表B:
B_ID
-----
5
6
7
8
Run Code Online (Sandbox Code Playgroud)
表C:
C_ID | C_Name
--------------
5 | Alpha
6 | Beta
Run Code Online (Sandbox Code Playgroud)
表D:
D_ID | D_Name
--------------
7 | Delta
8 | Gamma
Run Code Online (Sandbox Code Playgroud)
注意,表B中的值可以来自表C或表D.
我现在需要一个ID从表A 中显示的查询和一个名为第二列的查询,该列Name由基于B_ID表B列的相应名称组成.
预期结果应如下所示:
ID | Name
----------
1 | Alpha
2 | Beta
3 | Delta
4 | Gamma
Run Code Online (Sandbox Code Playgroud)
我试过的是这个查询:
SELECT *
FROM B
LEFT OUTER …Run Code Online (Sandbox Code Playgroud) 我有两个具有这种类型的IQueryable集合
public class Property
{
public string Name {get; set;}
}
Run Code Online (Sandbox Code Playgroud)
集合1,具有以下名称值:
A
A
A
B
Run Code Online (Sandbox Code Playgroud)
集合2,具有以下名称值:
A
B
B
Run Code Online (Sandbox Code Playgroud)
我想得到的是第三个集合,其中集合1和2的名称值匹配,如果没有匹配,则null (empty)如下:
Result Collection:
A A
A null
A null
B B
null B
Run Code Online (Sandbox Code Playgroud)
如何用C#,LINQ实现这一目标?
我想FULL OUTER JOIN在几个列上使用两个表之间,但是当两个列都为null时,它们在连接期间不被视为相等,因此我获得两个不同的行.如何编写连接,所以null列被认为是相等的?
我已经设置了一个简化的例子:
create table t1 (
id number(10) NOT NULL,
field1 varchar2(50),
field2 varchar2(50),
CONSTRAINT t1_pk PRIMARY KEY (id)
);
create table t2 (
id number(10) NOT NULL,
field1 varchar2(50),
field2 varchar2(50),
extra_field number(1),
CONSTRAINT t2_pk PRIMARY KEY (id)
);
insert into t1 values(1, 'test', 'test2');
insert into t2 values(1, 'test', 'test2', null);
insert into t1 values(2, 'test1', 'test1');
insert into t2 values(2, 'test1', 'test1', null);
insert into t1 values(3, 'test0', null);
insert into t2 values(3, …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”,并且因为这两个订单有不同的规格,它们仍然都出现。
任何有关如何实现预期结果的想法都将受到赞赏。
outer-join ×10
sql ×6
join ×5
mysql ×3
oracle ×3
sql-server ×2
alias ×1
c# ×1
left-join ×1
linq ×1
null ×1
postgresql ×1
select ×1