我必须从三个名为客户、产品和订单的表生成简单的报告。我的报告应该有一栏显示客户是否订购了该产品。如何根据带有产品 ID 的订单中存在的客户 ID 获取 Y 或 N 值?数据示例表如下:
customer
customer_id name address phone
123 govinda nepal 16910833
234 arjun nepal 15546235
product
product_id name brand type price
1 samsung gayalexy s5 samsung smartphone 55000
2 samsung gayalexy s6 samsung smartphone 65000
order
date product_id customer_id
1/1/2016 1 123
5/1/2016 2 123
Run Code Online (Sandbox Code Playgroud)
并希望报告栏如下
cust_id name product_id order_stat
Run Code Online (Sandbox Code Playgroud)
order_stat 应为 Y 或 N。
第一次来这里。
我对加入表格时的最佳实践有疑问。例如,以下两个查询都返回相同的结果:
SELECT i.id, p.first_name, p.last_name
FROM individuals i, profiles p
WHERE i.id = p.individual_id;
SELECT i.id, p.first_name, p.last_name
FROM individuals i INNER JOIN profiles p ON i.id = p.individual_id;
Run Code Online (Sandbox Code Playgroud)
这两种方法的优缺点是什么?请让我知道你的想法。我对性能差异感兴趣,但也对查询的可读性、从一个 RDMS 到另一个 RDMS 的可移植性感兴趣,等等。
谢谢!
前段时间我使用了查询提示,但后来意识到大多数时候 SQL Server 比我更聪明。 构建额外的索引/重新组织数据或查询并获得比强制服务器使用计划要好得多的结果这通常效率低下,但对于某些数据子集来说速度足够快。但现在我处于一种我不知道如何更好地组织数据的情况。
我有两张桌子。第一个表 T1 是 (Id, CustomerId),第二个表 T2 具有相同的列。我想在 CustomerId 上加入 T1 到 T2。并获得前 N 行。在这种情况下,优化器看到我只需要 N 个 top 并说,“嘿,我将使用循环并很快找到 N 个匹配项,尤其是当我使用索引查找时。” 但它不起作用,因为没有满足条件的数据。因此它使用 aloop join来连接一个 25m 的表和一个非常慢的 100k 表。
当我强制 SQL Server 使用合并联接时,我得到以下计划,该计划在一秒钟内执行:
我不想强迫它有两个原因:
在这种情况下我该怎么办?
很抱歉一直打扰你们,但 SQL 对我来说仍然是新的。我有这些表:Store_location、Product、Sizes、Sells、Available_in、Offers 和 Currency。目标是能够运行一个包含多个子查询的查询(需要WHERE子句),该查询将仅返回在所有商店位置销售的产品,而不返回其他任何内容。它还必须是可扩展的,这样如果任何商店打开或关闭,代码就不需要更改。我有这些杂谈让我开始,但我不知道从哪里开始:下面的第一个 select 语句是查询成功时需要显示的内容。SELECT Store_location.store_name,Product.product_name,Sizes.size_option, COUNT(store_location.store_id) AS store_count
JOIN Sells ON Sells.store_location_id = Store_location.store_location_id
JOIN Product ON Product.product_id = Sells.product_id
JOIN ON Available_in.product_id = Product.product_id
JOIN ON Available_in.sizes_id = Sizes.sizes_id
Run Code Online (Sandbox Code Playgroud)
我试图完成连接以显示我需要使用的表在哪里有外键约束。如果您需要任何其他信息,我可以提供。我添加了一个链接,显示所有相关表格的内容。我知道我需要在 WHERE 语句中嵌入至少一个子查询,但不确定在那里放什么。我知道有很多信息需要回顾,我理解如果没有人有时间提供帮助,但任何指导都将不胜感激。
我意识到这是一个迟到的请求,但如果有人能帮助我在这方面也使用EXISTS,我将不胜感激。
我将在 SQL Server 中为客户端创建几个表。对这个问题特别感兴趣的是FactStoreSale要创建表,并DimProduct在其中的第一个表将包括所有门店的销售情况,并包括例如StoreKey,DateKey,TimeKey,ProductKey和销售数据。
该DimProduct表将在关于产品,使用补充数据,即ProductName,ProductGroup,ProductCategory等这个表将在价格等每个商店而言缓慢改变的尺寸和存储产品的历史。该表将包括列FromDate和ToDate,它们分别描述了输入数据的时间和替换数据的时间(默认值为 2999 年,ToDate直到插入产品的新更新)。
我相信这是很常见的。但是,ProductKeys来自底层数据库的非常复杂的字符串,例如140-xx4449CH-4.44,9.
在我看来,我的替代方案是Checksum在 SQL Server 中使用将复杂字符串转换为整数,并将它们存储在单独的列中,ProductKeyInt
并在执行 JOINS 时使用这些列。但是校验和不保证唯一的整数值,这可能会导致问题。当我在 Virtual PC 和我自己的 PC 上尝试 Checksum 时,对相同值执行 Checksum 会返回不同的结果,这也是一个问题。我相信这两者一起排除了校验和,除非可以以某种方式操纵它以使其更独特?
另一种选择是使用更复杂的函数来确保将字符串值转换为整数,例如在我的问题中提供的此处。诸如这样的解决方案但也有问题,该值100-xx3和1003将例如得到同样的结果。从某种意义上说,如果对 SQL 不那么精通的人需要尝试查找使用该函数的 Query 的任何问题,则可能很难理解正在发生的事情,这也很复杂。
我的第三个选择似乎是使用该DimProduct表并首先从 SQL 代理更新该表,然后在该表上使用索引键并将该索引用作FactStoreSale表中的 ProductKeyInt(例如 ProductKeyInt 将是某种子查询FactStoreSale获取与 …
我认为这很简单,但我无法解决这个问题……我有一张contactsFields这样的桌子:
| id | contactId | fieldType | order | value |
Run Code Online (Sandbox Code Playgroud)
我想获得email与order0和company以order0为好。
获得任何一个都非常简单:
SELECT "contactId", "value"
FROM "contactFields"
WHERE "order" = 0 AND "fieldType" = '<email OR company>';
Run Code Online (Sandbox Code Playgroud)
此查询不能返回任何行或单个行,因为我们强制要求永远不会有 2 个字段具有相同的fieldType,contactId并且order
但我想同时获得它们(即在一行中合并 2 个结果),如下所示:
| contactId | emailWithOrder0 | companyWithOrder0 |
Run Code Online (Sandbox Code Playgroud)
我可以通过加入来做到这一点吗?
我不确定为什么下面的连接查询没有返回任何结果。
SELECT * FROM table1 JOIN table2 ON table1.fieldid = table2.idfield
Run Code Online (Sandbox Code Playgroud)
以下 2 个查询返回结果,所以当我可以清楚地看到两个表具有共同的连接字段值时,我不确定为什么连接不会选择任何行。
SELECT * FROM table1 WHERE fieldid = 900399530 (returns rows)
SELECT * FROM table2 WHERE idfield = 900399530 (returns rows)
Run Code Online (Sandbox Code Playgroud)
有任何想法吗?
以下是 2 列的数据类型:
fieldid [nvarchar] (50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
idfield [nvarchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL
通常这样写很方便:
SELECT *
FROM t1 # ... +many more tables
INNER JOIN t2 ON (t1.id = t2.col)
INNER JOIN t3 ON (t1.id = t3.col)
INNER JOIN t4 ON (t1.id = t4.col)
...
Run Code Online (Sandbox Code Playgroud)
作为带条件的交叉连接:
SELECT *
FROM t1, t2, t3, t4 # ... +many more tables
WHERE
t1.id = t2.col
AND t1.id = t3.col
AND t1.id = t4.col
# +include matches on columns of other tables
Run Code Online (Sandbox Code Playgroud)
但是,交叉连接的简单实现将比内部连接具有更高的时间复杂度。Postgres 是否将第二个查询优化为与第一个查询具有相同时间复杂度的查询?
我们有一个应用程序生成的查询,该查询使用一个视图,该视图具有两个通过 LEFT OUTER 连接连接的表。当仅从一个表(任一表)中按字段过滤时,会发生索引查找并且速度相当快。当 where 子句使用 OR 包含两个表中字段的条件时,查询计划将切换到表扫描并且不使用任何索引。
被过滤的所有四个字段都在它们各自的表上建立索引。
快速查询计划,我从一张表中筛选 3 个字段:https : //www.brentozar.com/pastetheplan/?id=Hym_4PRSO
慢查询计划,我过滤四个字段......三个来自一个表,一个来自另一个表:https : //www.brentozar.com/pastetheplan/?id=r1dVNDRHO
理想情况下,我想了解为什么会发生这种情况以及如何推动查询引擎利用所有索引。
我考虑过联合,但不幸的是,这个遗留系统正在使用ntext无法联合的值。还要注意两个表之间的连接是一对一的,所以我真的希望优化器利用索引,但也许它不知道?
我正在尝试返回数据,其中我想要来自 3 个不同表 (商品、供应商和价格)使用来自价格的外键 vid(供应商 ID)。好。
下面是表格的样子:
mysql> describe prices;
+-------+------------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------------------+------+-----+---------+----------------+
| pid | int(10) unsigned | NO | PRI | NULL | auto_increment |
| price | decimal(10,2) unsigned | YES | | NULL | |
| url | longtext | YES | | NULL | |
| iid | int(10) unsigned | NO | MUL | NULL | |
| vid | tinyint(3) unsigned …Run Code Online (Sandbox Code Playgroud) join ×10
sql-server ×5
postgresql ×2
t-sql ×2
count ×1
index-tuning ×1
mysql ×1
optimization ×1
oracle ×1
select ×1
subquery ×1
where ×1