假设我有一个查询 select a,b from xyz
结果将是:
a b
m1 10
m2 20
m3 30
我能否以某种方式总结所有 b 的内容,例如:
select sum(b) from (select a,b from xyz)
Run Code Online (Sandbox Code Playgroud)
它会给我结果 60。可能吗?愚蠢的问题?
我正在处理一个基本上将大量表聚合在一起的查询。
我尝试的第一种方法是将所有表内部连接成一个漂亮的大查询,看起来像这样:
select
a.col1
, a.col2
, a.col3
...
, b.col1
...
...
, l.col1
, l.col2
from myprimarytable a
join secondtable b on a.key = b.key
join third table c on a.key = c.key
...
join thelasttable l on a.key = b.key
Run Code Online (Sandbox Code Playgroud)
这需要永远运行。但是,看起来像这样的第二个解决方案:
create table #output (
primkey char(40)
, mycol1 char(1) null
, mycol2 decimal(20,1) null
...
, mylastcol varchar(max) null
)
insert into #output
select
a.col1
, a.col2
...
from myprimarytable a
update #output set
mycol3 = …Run Code Online (Sandbox Code Playgroud) STUDENT 表包含我学校数据库中的学生列表
LIBRARY_BOOK 表包含当前与任何学生一起使用的每本书的信息。
每个学生一次只允许携带一本书。
我想知道
每位 7 年级学生的图书馆图书。
我使用的是 Microsoft SQL Server 2008 R2
我有几个看起来几乎相似但行为方式不同的查询。
查询 1:
Select *
FROM STUDENT ST
LEFT JOIN LIBRARY_BOOK LB
ON ST.Student_Id = LB._Student_ID
WHERE ST.Class = 7
Run Code Online (Sandbox Code Playgroud)
查询 2:
Select *
FROM STUDENT ST
LEFT JOIN LIBRARY_BOOK LB
ON ST.Student_Id = LB._Student_ID
AND ST.Class = 7
Run Code Online (Sandbox Code Playgroud)
查询 3:
Select *
FROM STUDENT ST
LEFT JOIN LIBRARY_BOOK LB
ON ST.Student_Id = LB._Student_ID
AND ST.Class = 7
WHERE ST.Class = 7
Run Code Online (Sandbox Code Playgroud)
有人可以解释这些查询在输出和性能方面的区别吗?
我有一个表currency,paymenttype和invoiceamount。我必须写一个查询来获取currency,paymenttype并invoiceamount完成。
这对于 group by 来说非常简单。但实际上我有3种支付类型——0、1、2。表中的数据是
Currency PaymentType Invoice Amount
Aaa. 0. 100
Aaa. 1. 200
Aaa. 1. 50
Bbb. 0. 150
Bbb. 1. 100
Bbb. 2. 100
Run Code Online (Sandbox Code Playgroud)
我的查询是
Select currency, paymenttype, sum(invoiceamount) as total
from table
group by currency, paymenttype
Run Code Online (Sandbox Code Playgroud)
结果
Currency paymenttype total
Aaa. 0. 100
Aaa. 1. 250
Bbb. 0. 150
Bbb. 1. 100
Bbb. 2. 100
Run Code Online (Sandbox Code Playgroud)
作为Aaa。没有paymenttype2 它也应该显示一个值为 0 的行,如下所示。
Aaa. 2. 0 …Run Code Online (Sandbox Code Playgroud) 我有一个categories表,它有两列,id和name.
我有一个types表,其中包含三列id,category_id和points。
我有一个products表,其中包含三列id,type_id和customer_id。
这意味着每个产品都有一个类型,每个类型都有一个类别。一个品类有多种类型,一种类型有多种产品。
我正在使用 MySQL 和 PHP。
从 PHP 中,给定customer_id,我想知道客户在每个类别中分别拥有多少分(例如,向用户显示一个表格)。
我的解决方案:我首先会做一个查询来查找所有类别 id,然后对于每个category_id我会找到该类别中的所有类型(即,所有具有给定 的类型category_id);然后对于每一个,type_id我会计算有多少产品同时具有那个type_id和给定的customer_id,我会把那个数量乘以给定的点数type_id。将每个结果的所有结果相加type_id,我最终得到了给定客户在这方面的总分category_id。正如我所说,我必须为每个category_id. 我的解决方案会起作用,但在我看来它会非常慢。我正在寻找有关如何以更好的方式解决此问题的建议 - 使用更少的查询,或更快的查询,或两者兼而有之。 按照现在的方式,它可能会执行与类别数量一样多的查询。
例子:
/* TABLE: categories */
name id
A 1
B 2
C 3
/* TABLE: types */
points id category_id …Run Code Online (Sandbox Code Playgroud) 在下面的代码(我继承的)中,我收到消息“SQL80001 - ')' 附近的语法不正确”,错误出现在从底部算起的第三行,带有 + 号。我已经看过类似问题的这个答案,但这不是这里的问题。
select
b.batch_id,
b.submitted_dt,
b.batch_nm,
b.paused_cd,
b.job_cnt,
b.start_dt,
b.finish_dt,
m.module_nm,
m.module_id,
mc.hostname
from
tbl_bat_chess b,
tbl_job_bobs j,
tbl_man_holes m,
tbl_monkey_cokes mc
where
b.finish_dt is null
and to_char(b.submitted_dt, 'DD-MON-YYYY') = to_char(sysdate, 'DD-MON-YYYY')
and (to_number(sysdate - b.submitted_dt) * 1440) > 5 -- 5 minutes
and b.batch_id = j.batch_id
and b.batch_nm like '%EXAMPLE%'
and j.module_id = m.module_id
and m.proc_group_id not in (10, 18)
and j.machine_id = mc.machine_id (+)
group by b.batch_id, b.submitted_dt, b.batch_nm, b.paused_cd, b.job_cnt, b.start_dt, …Run Code Online (Sandbox Code Playgroud) 我有两个表如下:
create table first (id int, name varchar(20));
create table second (id int, value char(1),fid int);
Run Code Online (Sandbox Code Playgroud)
这些表具有以下记录:
insert into first values (1,'Ahmad'),(2,'Sami'),(3,'Khan');
insert into second values
(1,'a',1)
, (2,'b',1)
, (3,'c',2)
, (4,'d',1)
, (5,'e',2)
, (6,'f',3);
Run Code Online (Sandbox Code Playgroud)
我想从表中选择那些在表second中具有匹配记录first的单行记录。
所需的输出是:
身份证 | 姓名 | 价值 | 价值 | 价值 ---+-------+-------+-------+------- 1 | 艾哈迈德 | | 乙 | d 2 | 萨米语 | | | 电子 | 3 | 汗 | f | |
table 的单个记录的值数量 …
如果我有一个查询:
SELECT * FROM A
INNER JOIN B ON B.ID = A.ID
INNER JOIN C ON C.ID = B.ID
Run Code Online (Sandbox Code Playgroud)
这会为此查询返回不同的结果吗?
SELECT * FROM A
INNER JOIN B ON B.ID = A.ID
INNER JOIN C ON C.ID = A.ID
Run Code Online (Sandbox Code Playgroud)
在我看来,在第一个查询中,我会得到 A、B、C 的交集。在第二个查询中,我将得到 A、B 的交集和 A、C 的交集。
如果是这种情况,我是否会在 B/C 的列中找到 NULL 值,其中 B、C 之间没有交集?
我想cities_extended.city_id根据加入进行更新cities
桌子 cities
CREATE TABLE `cities` (
`id` int(11) NOT NULL,
`city` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`state_code` char(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`state_id` int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
ALTER TABLE `cities`
ADD PRIMARY KEY (`id`);
Run Code Online (Sandbox Code Playgroud)
桌子 cities_extended
CREATE TABLE `cities_extended` (
`id` int(11) NOT NULL,
`city` varchar(50) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`state_code` char(2) CHARACTER SET utf8 COLLATE utf8_unicode_ci DEFAULT NULL,
`zip` int(5) UNSIGNED …Run Code Online (Sandbox Code Playgroud) SELECT *
FROM GRNHISTORY GR
inner Join Inventorytransferlog itl on GR.ReferenceEntryID=itl.ReferenceEntryID
Run Code Online (Sandbox Code Playgroud)
GRNHISTORY和Inventorytransferlog两个表都有自己的 ID 列和唯一 ID。但是我们不需要它,也没有使用它。
ReferenceEntryID是foreign key从其他表。两个表都有 10 条记录。现在,当我运行此查询时,它向我显示了 100 条我似乎无法理解的记录。根据我的理解,它应该显示 10 条记录。请纠正我的错误。
join ×10
sql-server ×3
mysql ×2
count ×1
oracle ×1
performance ×1
php ×1
pivot ×1
postgresql ×1
syntax ×1
update ×1