簡體   English   中英

SQL 使用兩個表進行查詢,需要在其中一個表中搜索特定和多個列值

[英]SQL Query with two tables and need to search one of the tables for specific and multiple column values

我需要編寫一個涉及下面兩個示例表的復雜查詢,並且我正在努力理解如何正確構建查詢。

表結構如下,以及示例數據:

Table 1:
ID | Type | Size
A123 | Block | Medium
C368 | Square | Large
X634 | Triangle | Small
K623 | Square | Small
Table 2:
ID | Code | Description | Price
A123 | C06 | Sensitive Material | 99.99
A123 | H66 | Heavy Grade | 12.76
A123 | U74 | Pink Hue | 299.99

C368 | H66 | Heavy Grade | 12.76
C368 | G66 | Green Hue | 499.99
C368 | C06 | Sensitive Material | 99.99
C368 | K79 | Clear Glass | 59.99

X634 | G66 | Green Hue | 499.99
X634 | K79 | Clear Glass | 59.99
X634 | Z63 | Enterprise Class | 999.99

K623 | K79 | Clear Glass | 59.99
K623 | G66 | Green Hue | 499.99
K623 | X57 | Extra Piping | 199.99

查詢應主要基於表 1 中的Type列,然后加入表 2 的ID列。查詢的目標是搜索表 1 中具有表 2 中特定Code列組合的所有 ID。

最終的 output 應該是一個表格,對於 Type = Square AND both (Code = G66 AND Code = K79) 看起來像這樣:

ID 
C368
K623

應該返回這兩個 ID,因為它們在上面的偽查詢中都有 BOTH 選項代碼。

如何使用這兩個表組合這個結果? 以下是我編寫的兩個初始查詢 - 都不會產生正確的結果。 如您所見,我已經嘗試了 IN 運算符和 =/AND/OR 運算符。

嘗試 1(似乎可以使用 ONE 代碼,但不能使用 > 1 代碼):

select distinct ID
from
(
SELECT shapes.ID, details.code, details.description
FROM db.table2 details 
JOIN db.table1 shapes
ON details.VIN = shapes.VIN
WHERE shape.type='Square'
) src
where code IN ("G66", "K79")
-- where code = "G66" AND code = "K79" (Produces zero results)
-- where code = "G66" OR code = "K79" (Produces incorrect results)

嘗試 2(似乎可以使用 ONE 代碼,但不能使用 > 1 代碼):

SELECT distinct ID
FROM db.table2 details
WHERE ID IN
(
    SELECT ID FROM db.table1 shapes 
    WHERE shapes.type='Square' 
) AND code IN ("G66", "K79")
-- AND code = "G66" AND code = "K79" (produces zero results)
-- AND code = "G66" OR code = "K79" (Produces incorrect results)

謝謝

每當您遇到類似的問題時“我需要此表中的 ID,其中一行具有值 A,另一行具有值 B,並且兩行具有相同的 ID”您需要 select 所有匹配的行您的條件,將它們分組,然后對它們進行計數,並且僅使用具有匹配計數的行:

SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79')
GROUP BY t2.id
HAVING COUNT(*) = 2

如果可能有一些虛假的結果,比如兩行是 G66 而沒有行是 K79,那么這個簡單的計數就會失敗。 我們可以使用 MIN 和 MAX 來查看值(如果是 2):

SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79')
GROUP BY t2.id
HAVING MIN(t2.code) = 'G66' AND MAX(t2.code) = 'K79'

之所以有效,是因為按字母順序 G66 小於 K79,所以 G66 將是最小的

如果我們有 3 個必須強制的值,我們可以做一些技巧,比如將所有代碼變成一個數字,並要求總和是什么。 我將為此使用base 2:

SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79', 'X99')
GROUP BY t2.id
HAVING SUM(CASE t2.Code WHEN 'G66' THEN 1 WHEN 'K79' THEN 2 WHEN 'X99' THEN 4 END) = 7

如果我們將它們 map 設置為 1、2 和 4,那么生成 7(如果值是唯一的)的唯一方法是每個都有一個。 如果可能有 7 個 G66 而其他一個都沒有,給出一個虛假的結果,那么我們可能不得不單獨計算它們:

SELECT t2.id
FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id
WHERE t1.type = 'square' and t2.code IN ('G66', 'K79', 'X99')
GROUP BY t2.id
HAVING 
  SUM(CASE t2.code WHEN 'G66' THEN 1 ELSE 0 END) = 1 AND
  SUM(CASE t2.code WHEN 'K79' THEN 1 ELSE 0 END) = 1 AND
  SUM(CASE t2.code WHEN 'X99' THEN 1 ELSE 0 END) = 1 

這是我的想法。

通過 where 子句過濾 t1 中的數據,然后連接 t2,2 次,每次都按條件過濾以使 G66 和 K79 在同一個表中(2 個不同的連接)

Select t1.ID 
from t1 
inner join t2 as t2_G66 on t1.ID = t2_G66.ID
inner join t2 as t2_K79 on t1.ID = t2_K79.ID
where t1.Type = 'Square' and 
    t2_G66.Code = 'G66' and 
    t2_K79.Code = 'K79' 

這是小提琴

由於表 1 和表 2 是通過 ID 相關的,所以在獲取具有我們正在尋找的類型的相關行之后,您不能在表 1 中的 id 上使用 INNER JOIN 嗎?

我想我們可以首先進行查詢以獲取具有相關類型的所有行,然后運行INNER JOIN以獲取具有我們關心的 ID 的共享行。

最后,我們可以按他們的代碼列對我們的結果進行分組嗎?

也許這樣的事情可以工作?:

SELECT * FROM db.table1 WHERE db.table1.type = "whatever"
INNER JOIN db.table2 ON db.table1.id = db.table2.id
GROUP BY db.table2.code HAVING COUNT(*) >= 1
AND db.table2.code IN ("code_1, code_2, code_3")

我剛開始 SQL 所以我希望這個希望!

PS我意識到我沒有涵蓋您讓代碼成為您關心的代碼子集的成員的條件。 所以我認為這可能有效。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM