Як выдаліць у MS SQL WHERE IN (SELECT некалькі слупкоў)

i have a table lets call it "Cluster" which is related an second table элемент

кластар:

Id Group Ele1 Ele2 Ele3
1   1     1    2     3
2   1     4   NULL   9
3   2     5    8     7

элемент

Id Name
1  'A'
2  'b'
3  'c'
4  'd'
5  'z'
6  'j'
7  't'
8  'r'
9  'e'

Цяпер я павінен выдаліць кластар

DELETE FROM Cluster
WHERE   Cluster.Group= 1

but before i delete the rows from my Cluster i need to delete all related rows from элемент

DELETE FROM элемент
WHERE Id IN (SELECT Ele1 Ele2 Ele3 
             FROM Cluster 
             WHERE Cluster.Group= 1)

але гэты запыт не працуе, так што ж я сумую?

4
вызначыць не працуе.
дададзена аўтар Woot4Moo, крыніца
вызначыць не працуе.
дададзена аўтар Woot4Moo, крыніца
вызначыць не працуе.
дададзена аўтар Woot4Moo, крыніца
@ Woot4Moo азначае, што я ведаю IN (...) частка няправільная, таму што ў гэты толькі для асобных слупкоў, але гэта быў самы просты спосаб, каб паказаць, што я хачу без запісу Mutch
дададзена аўтар WiiMaxx, крыніца
@ Woot4Moo азначае, што я ведаю IN (...) частка няправільная, таму што ў гэты толькі для асобных слупкоў, але гэта быў самы просты спосаб, каб паказаць, што я хачу без запісу Mutch
дададзена аўтар WiiMaxx, крыніца
@ Woot4Moo азначае, што я ведаю IN (...) частка няправільная, таму што ў гэты толькі для асобных слупкоў, але гэта быў самы просты спосаб, каб паказаць, што я хачу без запісу Mutch
дададзена аўтар WiiMaxx, крыніца

11 адказы

Паспрабуйце гэта:

DELETE FROM Element
WHERE Id IN (SELECT Ele1
             FROM Cluster 
             WHERE Cluster.[Group] = 1
                   And Ele1 Is Not NULL

             Union 

             SELECT Ele2
             FROM Cluster 
             WHERE Cluster.[Group] = 1
                   And Ele2 Is Not NULL

             Union 

             SELECT Ele3 
             FROM Cluster 
             WHERE Cluster.[Group] = 1
                   And Ele3 Is Not NULL
)
4
дададзена
@WiiMaxx вы можаце выкарыстоўваць UNPIVOT
дададзена аўтар StuffHappens, крыніца
+1 працуе sqlfiddle.com/#!3/37d64/6/0
дададзена аўтар Tim Schmelter, крыніца
@Rawheiser але гэтая нармалізацыя будзе ў вялікай галаве :), таму што кожны радок у кластары будзе адлюстроўвацца ў калонку для табліцы (групы) з невядомым памерам слупка, але вядомы памерам радкі, так што кожны элементы з'яўляецца Іншым буйным на мабільны ў маёй табліцы апе элемент з'яўляецца аб'ект, які захоўваецца ў гэтым вочку, так што я не думаю, што гэта будзе прасцей з вялікай колькасцю табліц і я не ведаю, як бы вы будаваць адносіны паміж імі, але калі вы хочаце, вы можаце паказаць яго на мой ін скрыпкі. можа быць, я пазнаю нешта новае :), як кожны дзень: D
дададзена аўтар WiiMaxx, крыніца
таму я не магу адмаўляць выкліку абярыце некалькі разоў?
дададзена аўтар WiiMaxx, крыніца
@Rawheiser MHH я не слабець пісаць гэтую частку 7 раз (той мой фактычны nummber Калоннай) адпаведна правілу не паўтараць сябе
дададзена аўтар WiiMaxx, крыніца
Нармалізуюць вашыя дадзеныя, калі вы хочаце, каб мець магчымасць qwuery гэта правільна. Гэты дызайн дрэнны, ён павінен befixed, перш чым ісці далей.
дададзена аўтар HLGEM, крыніца
Кажучы аб «Ня паўтарайце сабе» ... гэта менавіта тое, што вы робіце з вашымі ня-нармаваны табліцамі. Гэта можа быць больш працы авансам, каб змяніць свой дызайн, але гэта, хутчэй за ўсё, акупіцца ў доўгатэрміновай перспектыве.
дададзена аўтар G Mastros, крыніца
Вы можаце далучыцца да стала кластара і паставіць усе тры параўнання ў адным, дзе становішча, але гэта не будзе гэтак жа ясна, як гэта рашэнне і далучыцца ў ВЕЬЕТЕ ёсць і іншыя праблемы. Я б паставіў іп-стрыжань стала саюзаў ў ім ўласнае меркаванне, калі ён часта выкарыстоўваецца. Зводную можа быць іншае рашэнне, але яно можа мець уплыў на прадукцыйнасць ... Я б прытрымлівацца саюза.
дададзена аўтар Rawheiser, крыніца
"Не паўтарайце сабе» добрае правіла, але GREAT правіла было б «нармалізаваць дадзеныя». Захоўвайце ўсе паўтараюцца слупкі дадзеных у сваёй табліцы - і тады вы маглі б зрабіць выбар адзіночнага ліку.
дададзена аўтар Rawheiser, крыніца

Кампактны і чысты:

DELETE FROM Element
WHERE Id IN (
    SELECT
        Ele
    FROM Cluster AS T
    CROSS APPLY (VALUES
        (T.Ele1)
        , (T.Ele2)
        , (T.Ele3)
    ) AS X (Ele)
    WHERE T.Group= 1
)
3
дададзена
+1 для :) вашага атрымання дадатковай інфармацыі па
дададзена аўтар WiiMaxx, крыніца
ах, што цікава (я не ведаю, чаму я павінен выкарыстоўваць дужкі). Падобна на тое, вы пераможца тут, але дазвольце мне спытаць вас сёе-тое на ваш запыт, чаму вы пішаце AS X (Ele) замест AS Ele нешта асаблівае? таксама `AS T`part робіць гэта некаторыя паляпшэнні я не бачу?
дададзена аўтар WiiMaxx, крыніца
яна не працуе на аснове гэтай Скрыпкі
дададзена аўтар WiiMaxx, крыніца
@WilMaxx група, магчыма, павінна быць змешчана ў квадратных дужках (вы далі нам ўзор, дзе вы не выкарыстоўвалі дужку).
дададзена аўтар Serge, крыніца
Глядзіце самі: sqlfiddle.com/#!3/05cca/4/0
дададзена аўтар Serge, крыніца
X з'яўляецца «табліца» імя псеўданіма, Ele гэтага імя слупка. І, вядома, з'яўляецца абавязковым для запыту для запуску.
дададзена аўтар Serge, крыніца

Кампактны і чысты:

DELETE FROM Element
WHERE Id IN (
    SELECT
        Ele
    FROM Cluster AS T
    CROSS APPLY (VALUES
        (T.Ele1)
        , (T.Ele2)
        , (T.Ele3)
    ) AS X (Ele)
    WHERE T.Group= 1
)
3
дададзена
+1 для :) вашага атрымання дадатковай інфармацыі па
дададзена аўтар WiiMaxx, крыніца
ах, што цікава (я не ведаю, чаму я павінен выкарыстоўваць дужкі). Падобна на тое, вы пераможца тут, але дазвольце мне спытаць вас сёе-тое на ваш запыт, чаму вы пішаце AS X (Ele) замест AS Ele нешта асаблівае? таксама `AS T`part робіць гэта некаторыя паляпшэнні я не бачу?
дададзена аўтар WiiMaxx, крыніца
яна не працуе на аснове гэтай Скрыпкі
дададзена аўтар WiiMaxx, крыніца
@WilMaxx група, магчыма, павінна быць змешчана ў квадратных дужках (вы далі нам ўзор, дзе вы не выкарыстоўвалі дужку).
дададзена аўтар Serge, крыніца
Глядзіце самі: sqlfiddle.com/#!3/05cca/4/0
дададзена аўтар Serge, крыніца
X з'яўляецца «табліца» імя псеўданіма, Ele гэтага імя слупка. І, вядома, з'яўляецца абавязковым для запыту для запуску.
дададзена аўтар Serge, крыніца

<�Моцны> АБНОЎЛЕНА

delete  from Element
where ID in
(
SELECT Item
   FROM 
      (SELECT [Group], Ele1, cast([Ele2] as int) Ele2, Ele3 FROM Cluster) p
   UNPIVOT(Item FOR Ele IN (Ele1, Ele2, Ele3) )AS unpvt
  )
1
дададзена
Цяпер ён працуе: sqlfiddle.com/#!3/37d64/45
дададзена аўтар StuffHappens, крыніца
вы прапусціце WHERE Group = 1 частка :)
дададзена аўтар WiiMaxx, крыніца
яна не працуе. вось Fiddle
дададзена аўтар WiiMaxx, крыніца

Вы не выбіраеце слупок ID з кластара ў подзапросов. спроба:

DELETE FROM Element
WHERE Id IN (SELECT Id 
         FROM Cluster 
         WHERE Cluster.Group= 1)
1
дададзена
няправільна поле Id.
дададзена аўтар Woot4Moo, крыніца
@Joe я не думаю, што вы атрымаеце тое, што я хачу ^^
дададзена аўтар WiiMaxx, крыніца
ок дазвольце мне растлумачыць гэта наступным чынам Кластар і Элемент маюць множны 1: 1 Адносіны . Cluster.Ele1` ў Element.Id , Cluster.Ele2 у Element.Id , ...
дададзена аўтар WiiMaxx, крыніца
Растлумачыць? Подзапросов вяртае ўсе ідэнтыфікатары з кластара з групай 1. Запіс з элемента з ідэнтыфікатарам у гэтым подзапросов будзе выдаленая.
дададзена аўтар Joe, крыніца

Вы не выбіраеце слупок ID з кластара ў подзапросов. спроба:

DELETE FROM Element
WHERE Id IN (SELECT Id 
         FROM Cluster 
         WHERE Cluster.Group= 1)
1
дададзена
няправільна поле Id.
дададзена аўтар Woot4Moo, крыніца
@Joe я не думаю, што вы атрымаеце тое, што я хачу ^^
дададзена аўтар WiiMaxx, крыніца
ок дазвольце мне растлумачыць гэта наступным чынам Кластар і Элемент маюць множны 1: 1 Адносіны . Cluster.Ele1` ў Element.Id , Cluster.Ele2 у Element.Id , ...
дададзена аўтар WiiMaxx, крыніца
Растлумачыць? Подзапросов вяртае ўсе ідэнтыфікатары з кластара з групай 1. Запіс з элемента з ідэнтыфікатарам у гэтым подзапросов будзе выдаленая.
дададзена аўтар Joe, крыніца

Вы не выбіраеце слупок ID з кластара ў подзапросов. спроба:

DELETE FROM Element
WHERE Id IN (SELECT Id 
         FROM Cluster 
         WHERE Cluster.Group= 1)
1
дададзена
няправільна поле Id.
дададзена аўтар Woot4Moo, крыніца
@Joe я не думаю, што вы атрымаеце тое, што я хачу ^^
дададзена аўтар WiiMaxx, крыніца
ок дазвольце мне растлумачыць гэта наступным чынам Кластар і Элемент маюць множны 1: 1 Адносіны . Cluster.Ele1` ў Element.Id , Cluster.Ele2 у Element.Id , ...
дададзена аўтар WiiMaxx, крыніца
Растлумачыць? Подзапросов вяртае ўсе ідэнтыфікатары з кластара з групай 1. Запіс з элемента з ідэнтыфікатарам у гэтым подзапросов будзе выдаленая.
дададзена аўтар Joe, крыніца

Нармалізацыя табліцы, каб не мець некалькі слупкоў з'яўляецца лепшым адказам.

Адказ G MASTRO з'яўляецца добра, улічваючы існуючы дызайн стала.

Як гэта будзе выглядаць нармалізуецца ... так што вы можаце проста зрабіць:

delete from Element 
where Id in ( select EleId from  GroupElements where Group_id = 1 )


*Cluster* 

Id Group
1   1   
2   1   
3   2   

*GroupElements*

Group_id EleId
1   1
1   2
1   3
1   4
1   9
2   5
2   8
2   7


*Element*

Id Name
1  'A'
2  'b'
3  'c'
4  'd'
5  'z'
6  'j'
7  't'
8  'r'
9  'e'
1
дададзена
так як бы вы нармалізуюць гэтую табліцу?
дададзена аўтар WiiMaxx, крыніца

Ёсць некалькі працоўных рашэнняў, але я не бачу якіх-небудзь тлумачэнняў, чаму яны працуюць, і ваша спроба трывае няўдачу.

<�Код> IN аператар хоча спіс значэнняў, каб праверыць. У найпростым выпадку гэта выглядае як WHERE слупка IN (value1, value2, value3 ...) . Ён таксама працуе з SELECT спіс: WHERE слупка IN (SELECT FROM somecolumn sometable) .

Ваш запыт не вяртае адзін слупок, які можна выкарыстоўваць у выглядзе спісу, а тры розных слупкоў. Гэта няправільны сінтаксіс для аператара IN. Рашэнне G Mastros выкарыстоўвае аператар UNION, каб аб'яднаць тры розных запытаў на выбарку ў адным, адзін слупок, выніковы набор.

(Incedentally, я хацеў бы выкарыстаць UNION ALL у дадзеным выпадку, паколькі дубляваныя значэння не з'яўляюцца праблемай і UNION гэта павольней аперацыя. Але праверыць статыстыку кліента, як праверка некалькіх копій значэння могуць быць больш, чым ўцечкі прадукцыйнасці ЗЛУЧЭННІ )

StuffHappens выкарыстоўвае UNPIVOT аператара, каб атрымаць такое ж паводзіны расшчаплення трох патрэбных слупкоў у адным наборы вынікаў. Асабіста я б з UNION , у асноўным таму, што я знаходжу UNPIVOT сінтаксіс складаней для разумення.

1
дададзена
DELETE FROM Element
WHERE Id IN (SELECT Ele1
         FROM Cluster 
         WHERE Cluster.Group= 1) AND Id IN (SELECT Ele2
         FROM Cluster 
         WHERE Cluster.Group= 1) AND Id IN (SELECT Ele3
         FROM Cluster 
         WHERE Cluster.Group= 1)
0
дададзена
Не працуе: sqlfiddle.com/#!3/37d64/8/0 (параўнайце з вынікам ад Mastros адказу).
дададзена аўтар Tim Schmelter, крыніца
Гэтыя Ands выглядаюць, як яны павінны быць Ош.
дададзена аўтар Anthony Grist, крыніца
DELETE FROM Element
WHERE Id IN (SELECT Ele1
         FROM Cluster 
         WHERE Cluster.Group= 1) AND Id IN (SELECT Ele2
         FROM Cluster 
         WHERE Cluster.Group= 1) AND Id IN (SELECT Ele3
         FROM Cluster 
         WHERE Cluster.Group= 1)
0
дададзена
Не працуе: sqlfiddle.com/#!3/37d64/8/0 (параўнайце з вынікам ад Mastros адказу).
дададзена аўтар Tim Schmelter, крыніца
Гэтыя Ands выглядаюць, як яны павінны быць Ош.
дададзена аўтар Anthony Grist, крыніца