2017-04-07 34 views
1

我試圖返回所有行中的特定ID,其中在與這些ID綁定的行中的任何一行中滿足條件。請原諒我是新手到SQL ...實施例下面:SQL - 返回所有行的ID,其中一行符合條件A,B或C


  • ID *線*#*


  • 12 * 1 * A *

  • 12 * 2 * B *
  • 12 * 3 * X *
  • 12 * 4 * Y *
  • 15 * 1 * A *
  • 15 * 2 * B *
  • 15 * 3 * C *

不知道什麼代碼會比我的選擇和條件=其它(X ,Y或Z)返回:


  • ID *行*#*


  • 12 * 1個* A * < - 不包括X,Y,或Z但是

  • 12 * 2 * B * <的ID的一部分 - 具有X在另一行該ID的
  • 12 * 3 * X *
  • 12 * 4 * Y *

我想拉都行記錄,儘管沒有滿足條件,只要他們身份證件的一部分t有一排符合條件。

感謝您的幫助!

*編輯:包括試圖代碼*

SELECT ID 
,LINE 
,# 
    WHERE ID, 
IN (
SELECT ID 
WHERE # IN ('X','Y','Z')) 

結果:

ID LINE # 
12 3 X 
12 4 Y 

我需要什麼:

ID LINE # 
12 1 A 
12 2 B 
12 3 X 
12 4 Y 

我幾乎覺得我需要創建一個臨時表格ID &使用我的條件IN(' X','Y','Z'),然後將所有LINE的內部連接標識爲非X,Y,Z。我認爲這可能有效,但我還沒有學會如何使用臨時表。我有點困擾,因爲我正在使用一個查詢,在這裏我簡化了一個查詢,在這裏我選擇了18個連接其他7個表的字段。我認爲這只是讓我對子查詢的理解複雜化了,而不是那個被這個子查詢影響的子查詢。

謝謝大家的幫助和解答!

+0

是三列還是單列? – scsimon

+0

使用子查詢來標識ID,然後使用ID爲ID的IN來返回實際的行 –

+0

scsimon的代碼應該在正確使用時工作。你嘗試了我的OLAP方法嗎? – dnoeth

回答

4

您可以使用子查詢和IN

Select * 
From YourTable 
where ID in (select ID from YourTable where # in ('X','Y','Z')) 

剛一說明,有一個在您的數據沒有12 * 4 * C *但我認爲這只是一個O型在你的結果,應該是12 * 4 * Y *

+0

謝謝你的回答。我相信這是正確的。我嘗試了這一點,但不幸的是,我有7個表加入,以返回我需要的不同領域,我無法得到這個工作。我不確定這是否是因爲它,但它可能是。我有每個ID有很多LINE綁定到它,每個LINE都有一個#。當我使用這個,我仍然只返回我在我的條件(X,Y,Z)中輸入的#。我已經通過選擇沒有條件的特定ID進行測試,並返回更多沒有(X,Y,Z)的LINE。我將繼續嘗試子查詢方法。 – CGermain

+0

@CGermain將您的代碼發佈在與您的示例數據相關的原始問題中。 – scsimon

1

除了子查詢方法,你也可以嘗試一個OLAP功能(根據實際的數據,這可能是好還是壞,當然)

在Teradata數據就可以申請合格:

Select * 
From YourTable 
qualify -- check if any row with the same ID has X/Y/Z 
    max(case when ID in ('X','Y','Z') then 1 else 0 end) 
    over (partition by ID) = 1 

在SQL Server中,你必須使用派生表/ CTE:

Select * 
From 
(Select *, 
     max(case when ID in ('X','Y','Z') then 1 else 0 end) 
     over (partition by ID) as flag 
    from YourTable 
) as dt 
where flag = 1 
相關問題