SQL Select 3表间查询
SQL Select Query between 3 tables
我在创建查询以从 3 table 秒中提取数据时遇到问题。
我有 job_skus
table、skus
table 和 stage
table,我正在尝试 select 整个月的所有工作 SKU,而不考虑 jobNo
,例如显示 4 月份所有工作 SKU 的列表。
table 的结构是
Job_Sku example data
JobNo J4454 J4454
Sku (refences Product.Sku) 93339 9947
Quantity 500 600
Stage 1 2
Products
Sku(primary key) 93339 9947
Description Galvanised Nails Steel Rods 900mm
Stage
jobNo J4454 J4454
stage 1 2
date 04/04/2015 12/04/2015
等等。
我想出了这个问题
SELECT jm.sku,jm.quantity,p.description
FROM stage as s, products as p, job_sku as jm
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
AND jm.stage = s.stage AND p.sku = jm.sku
但它似乎在查询中获取重复数据。我是否需要使用某种连接,或者提取该日期期间的所有阶段并将结果连接到 job_sku
table?
SELECT distinct jm.sku,jm.quantity,p.description
FROM stage as s, products as p, job_sku as jm
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
AND jm.stage = s.stage AND p.sku = jm.sku
首先,使用正确的联接。您使用的连接样式已弃用。
Explicit joins 加入 ANSI SQL 已有 20 多年了。
其次,如果你得到正确的结果但有些行是重复的,你只需要添加DISTINCT
SELECT DISTINCT jm.sku,jm.quantity,p.description
FROM stage as s
INNER JOIN job_sku as jm ON(jm.stage = s.stage)
INNER JOIN products as p ON(p.sku = jm.sku)
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
这是一个建议。线程中的其他人建议 distinct 会导致相同的结果,但是使用 exists 谓词阐明了查询的意图 (IMO):
SELECT jm.sku
, jm.quantity
, p.description
FROM products as p
JOIN job_sku as jm
ON p.sku = jm.sku
WHERE EXISTS (
SELECT 1
FROM stage s
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
AND jm.stage = s.stage
);
正如其他人也提到的,ANSI 连接将使查询更容易理解。只要我们活着,供应商将继续支持“,”连接,因此代码不会中断,但 ANSI 连接将使其更易于维护。
我在创建查询以从 3 table 秒中提取数据时遇到问题。
我有 job_skus
table、skus
table 和 stage
table,我正在尝试 select 整个月的所有工作 SKU,而不考虑 jobNo
,例如显示 4 月份所有工作 SKU 的列表。
table 的结构是
Job_Sku example data
JobNo J4454 J4454
Sku (refences Product.Sku) 93339 9947
Quantity 500 600
Stage 1 2
Products
Sku(primary key) 93339 9947
Description Galvanised Nails Steel Rods 900mm
Stage
jobNo J4454 J4454
stage 1 2
date 04/04/2015 12/04/2015
等等。
我想出了这个问题
SELECT jm.sku,jm.quantity,p.description
FROM stage as s, products as p, job_sku as jm
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
AND jm.stage = s.stage AND p.sku = jm.sku
但它似乎在查询中获取重复数据。我是否需要使用某种连接,或者提取该日期期间的所有阶段并将结果连接到 job_sku
table?
SELECT distinct jm.sku,jm.quantity,p.description
FROM stage as s, products as p, job_sku as jm
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
AND jm.stage = s.stage AND p.sku = jm.sku
首先,使用正确的联接。您使用的连接样式已弃用。
Explicit joins 加入 ANSI SQL 已有 20 多年了。
其次,如果你得到正确的结果但有些行是重复的,你只需要添加DISTINCT
SELECT DISTINCT jm.sku,jm.quantity,p.description
FROM stage as s
INNER JOIN job_sku as jm ON(jm.stage = s.stage)
INNER JOIN products as p ON(p.sku = jm.sku)
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
这是一个建议。线程中的其他人建议 distinct 会导致相同的结果,但是使用 exists 谓词阐明了查询的意图 (IMO):
SELECT jm.sku
, jm.quantity
, p.description
FROM products as p
JOIN job_sku as jm
ON p.sku = jm.sku
WHERE EXISTS (
SELECT 1
FROM stage s
WHERE s.Date BETWEEN '2015-04-01' AND '2015-04-30'
AND jm.stage = s.stage
);
正如其他人也提到的,ANSI 连接将使查询更容易理解。只要我们活着,供应商将继续支持“,”连接,因此代码不会中断,但 ANSI 连接将使其更易于维护。