相关疑难解决方法(0)

加入与子查询

我是一个老派的MySQL用户,并且总是优先JOIN于子查询.但是现在每个人都使用子查询,我讨厌它; 我不知道为什么.

如果存在任何差异,我缺乏理论知识来判断自己.子查询是否与a一样好JOIN,因此没有什么可担心的?

mysql sql join subquery

780
推荐指数
14
解决办法
40万
查看次数

获取具有列的最大值的行

表:

UserId, Value, Date.
Run Code Online (Sandbox Code Playgroud)

我想得到UserId,每个UserId的max(Date)值.也就是说,具有最新日期的每个UserId的值.有没有办法在SQL中执行此操作?(最好是Oracle)

更新:对任何含糊不清的道歉:我需要获取所有UserIds.但对于每个UserId,只有该用户具有最新日期的那一行.

sql oracle greatest-n-per-group

556
推荐指数
10
解决办法
56万
查看次数

列的原因在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

可能重复:
SQL中的GROUP BY /聚合函数混淆

我收到了一个错误 -

列'Employee.EmpID'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中.


select loc.LocationID, emp.EmpID
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 
Run Code Online (Sandbox Code Playgroud)

这种情况符合Bill Karwin给出的答案.

修正以上,适合ExactaBox的答案 -

select loc.LocationID, count(emp.EmpID) -- not count(*), don't want to count nulls
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by loc.LocationID 
Run Code Online (Sandbox Code Playgroud)

原始问题 -

对于SQL查询 -

select *
from Employee as emp full join Location as loc 
on emp.LocationID = loc.LocationID
group by (loc.LocationID) …
Run Code Online (Sandbox Code Playgroud)

sql group-by aggregate-functions

248
推荐指数
4
解决办法
60万
查看次数

使用左连接选择一对多关系中的第一条记录

我正在尝试使用左连接来连接两个表.结果集必须只包含"右"连接表中的第一条记录.

可以说我有两张表A和B如下;

表"A"

code | emp_no

101  | 12222
102  | 23333
103  | 34444
104  | 45555
105  | 56666
Run Code Online (Sandbox Code Playgroud)

表"B"

code | city       | county
101  | Glen Oaks  | Queens
101  | Astoria    | Queens
101  | Flushing   | Queens
102  | Ridgewood  | Brooklyn
103  | Bayside    | New York
Run Code Online (Sandbox Code Playgroud)

预期产出:

code | emp_no | city      | county
101  | 12222  | Glen Oaks | Queens
102  | 23333  | Ridgewood | Brooklyn
103  | 34444 …
Run Code Online (Sandbox Code Playgroud)

sql left-join

42
推荐指数
5
解决办法
7万
查看次数

如何将LEFT JOIN限制为SQL Server中的第一个结果?

我有一点SQL几乎正在做我想要它做的事情.我正在使用三个表,一个是Users,UserPhoneNumbers和UserPhoneNumberTypes.我正在尝试获取一个用户列表,其中包含用于导出的电话号码.

数据库本身很旧并且存在一些完整性问题.我的问题是,数据库中每个电话号码应该只有1种类型,但事实并非如此.当我运行这个时,我得到每个人的多行结果,如果它们包含例如两个"Home"数字.

如何修改SQL以获取列出的第一个电话号码并忽略其余的号码?我在SQL Server中,我知道TOP语句.但是,如果我将"TOP 1"添加到LEFT JOIN select语句,它只是给我数据库中的第一个条目,而不是每个用户的第一个条目.

这适用于SQL Server 2000.

谢谢,

SELECT  Users.UserID, 
  Users.FirstName, Users.LastName,
  HomePhone, WorkPhone, FaxNumber

FROM Users

LEFT JOIN
 (SELECT UserID, PhoneNumber AS HomePhone
 FROM UserPhoneNumbers LEFT JOIN UserPhoneNumberTypes ON UserPhoneNumbers.UserPhoneNumberTypeID=UserPhoneNumberTypes.UserPhoneNumberTypeID
 WHERE UserPhoneNumberTypes.PhoneNumberType='Home') AS tmpHomePhone
 ON tmpHomePhone.UserID = Users.UserID
LEFT JOIN
 (SELECT UserID, PhoneNumber AS WorkPhone
 FROM UserPhoneNumbers LEFT JOIN UserPhoneNumberTypes ON UserPhoneNumbers.UserPhoneNumberTypeID=UserPhoneNumberTypes.UserPhoneNumberTypeID
 WHERE UserPhoneNumberTypes.PhoneNumberType='Work') AS tmpWorkPhone
 ON tmpWorkPhone.UserID = Users.UserID
LEFT JOIN
 (SELECT UserID, PhoneNumber AS FaxNumber
 FROM UserPhoneNumbers LEFT JOIN UserPhoneNumberTypes ON UserPhoneNumbers.UserPhoneNumberTypeID=UserPhoneNumberTypes.UserPhoneNumberTypeID
 WHERE UserPhoneNumberTypes.PhoneNumberType='Fax') …
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2000 greatest-n-per-group

21
推荐指数
3
解决办法
4万
查看次数

选择第一个匹配的行

我有一个表"tbl",看起来像这样:

prod | cust | qty
p1   | c1   | 5
p1   | c2   | 10
p2   | c1   | 2
p3   | c2   | 8
Run Code Online (Sandbox Code Playgroud)

我需要的是一个明确的产品和客户对列表,但只有第一个客户,如果产品销售给多个客户.换句话说,结果需要如下所示:

prod | cust
p1   | c1   
p2   | c1   
p3   | c2   
Run Code Online (Sandbox Code Playgroud)

我已经尝试了每一种我能想到的方式,但我无法得到正确的结果.很明显,既不是不同的也不是group by(因为它们都将返回p1,c2行).

我发现这个问题是一个非常接近的匹配,但我无法弄清楚如何重新编写它以使它做我需要的.

最重要的是,目前所有这些都需要在Access 2007或更高版本中运行,但在将来的某个时候它也需要在MySQL中运行.

对于也将结果加入到客户表中的任何人来说,这是额外的功劳,这样我就可以从客户代码中查找人类可读的名称,例如c1 => Fred Bloggs Spanners

sql ms-access

14
推荐指数
1
解决办法
4万
查看次数

使用sqlalchemy仅从相关表中选择一行

假设我有一个Author表和一个Post表,每个作者可以有几个帖子.

现在,通过单个 sqlalchemy查询,我想获得所有活跃的作者和每个最新发布的帖子.

我一直试图通过获取加载作者的帖子列表,使用子查询将结果组合在一起,如下所示:

subquery = DBSession.query(Author.id, func.max(Post.publish_date).label("publish_date")) \
    .join(Post.author) \
    .filter(Post.state == 'published') \
    .filter(Author.state == 'active') \
    .group_by(Author.id) \
    .subquery()

query = DBSession.query(Post) \
    .options(joinedload(Post.author)) \
    .join(Post.author) \
    .join(subquery, and_(Author.id == subquery.c.id, 
                         Post.publish_date == subquery.c.publish_date))
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个来自具有相同publish_date的作者的两个帖子,并且这些是最新的帖子,那意味着我将该作者在我的结果列表中出现两次.虽然我可以使用第二个子查询来消除欺骗(使用func.max(Post.id)),但这似乎真的是非常错误的方法.有没有更好的方法来解决这个问题?

(同样,我正在寻找一个单一的查询,所以我试图避免查询作者表,然后循环并对我的结果中的每个作者进行Post查询.)

python sqlalchemy

5
推荐指数
1
解决办法
3115
查看次数

如何将连接保留到 SQL Server 中的第一行

如何左连接两个表,仅从第二个表中选择第一行? 第一场比赛

我的问题是跟进: SQL Server:如何加入第一行 我使用了该线程中建议的查询。

CREATE TABLE table1(
  id INT NOT NULL
);
INSERT INTO table1(id) VALUES (1);
INSERT INTO table1(id) VALUES (2);
INSERT INTO table1(id) VALUES (3);
GO

CREATE TABLE table2(
  id INT NOT NULL
, category VARCHAR(1)
);
INSERT INTO table2(id,category) VALUES (1,'A');
INSERT INTO table2(id,category) VALUES (1,'B');
INSERT INTO table2(id,category) VALUES (1,'C');
INSERT INTO table2(id,category) VALUES (3,'X');
INSERT INTO table2(id,category) VALUES (3,'Y');
GO

------------------
SELECT 
table1.* 
,FirstMatch.category
FROM table1

CROSS APPLY (
    SELECT TOP 1 
    table2.id
    ,table2.category …
Run Code Online (Sandbox Code Playgroud)

sql sql-server left-join

5
推荐指数
1
解决办法
896
查看次数

仅在三个表上加入一行

(我的问题很多时候都涉及到两个表,并且已经在这里,这里这里得到了解答.但是我无法弄清楚如何对涉及的三个表做同样的事情.)

我有三个表,A,B和C,其中A有很多B,B有很多C.我想加入这些表,每个A选择零或一行,其中一个应该基于C中的条件.

例如,假设:

SELECT
     a.aId
    ,b.bId
    ,c.cId
FROM
    a
    INNER JOIN b ON b.aId=a.aId
    INNER JOIN c ON c.bId=b.bId
WHERE
    c.someColumn='foo'
Run Code Online (Sandbox Code Playgroud)

...产生以下结果:

aId   bId   cId
===   ===   ===
1     11    101
1     12    102
1     12    103
2     21    201
2     21    203
2     22    202
Run Code Online (Sandbox Code Playgroud)

...那么我想,例如,检索两个不同的A行,最高的那些cId.

aId   bId   cId
===   ===   ===
1     12    103
2     21    203
Run Code Online (Sandbox Code Playgroud)

sql sql-server

2
推荐指数
1
解决办法
127
查看次数