Zwei Abfragen verbinden

Hallo, ich habe eine Tabelle mit Variablenwerten.
Wie kann ich die beiden Abfragen verbinden, dass ich von allen Dokumenten mit ‚Verschleissteil‘ = ‚1‘ die ‚Artikelnummer‘ angezeigt bekomme?

Abfrage 1

Select distinct Vv.ValueCache, vv.DocumentID
 From VariableValue Vv
 Where Vv.VariableID =  (     select variableid
                    from variable
                    where Variablename like 'Artikelnummer')
 order by vv.ValueCache ASC

Abfrage 2

Select distinct Vv.DocumentID 
 From VariableValue Vv
 Where Vv.VariableID =  (     select variableid
                    from variable
                    where Variablename like 'Verschleissteil')
       And Vv.ValueCache = '1'
 order by Vv.DocumentID ASC

Ergebnisspalten sollten ‚Artikelnummer‘, ‚DocumentID‘, ‚Verschleissteil‘ sein

Hallo,
würdet ihr das so machen, oder gibt’s eine bessere Lösung?

> select 
>     *
> from
> (
> Select distinct Vv.ValueCache Artikelnummer, vv.DocumentID
>  From VariableValue Vv
>  Where Vv.VariableID =  (     select variableid
>                     from variable
>                     where Variablename like 'Artikelnummer')
> ) as a
> inner join 
> (
> Select distinct v2.ValueCache Verschleissteil, V2.DocumentID 
>  From VariableValue V2
>  Where V2.VariableID =  (     select variableid
>                     from variable
>                     where Variablename like 'Verschleissteil')
>        And V2.ValueCache = '1'
> ) as b
> on a.DocumentID = b.DocumentID 
> order by a.Artikelnummer

Hi,

wahrscheinlich schon.

Das sieht mir viel zu kompliziert aus, kann dir aber ohne Nachfrage keine Alternative anbieten, weil mir der Tabellenaufbau und die Inhalte nicht ganz klar sind.

Was ist das überhaupt für ein Datenbanksystem?

Woher kommt dieses „ValueCache“?

In welcher Tabelle und welcher Spalte stehen „Verschleissteil“ und der Wert „1“?

Gruß
Christa

Hallo Christa,
das sind die Tabellen :wink:

CREATE TABLE [dbo].[Variable] (
    [VariableID]                  INT            IDENTITY (1, 1) NOT NULL,
    [VariableName]                NVARCHAR (255) NOT NULL,
    [VariableType]                INT            NOT NULL,
    [IsDeleted]                   BIT            NOT NULL,
    [FlagUnique]                  BIT            NOT NULL,
    [FlagMandatory]               BIT            NOT NULL,
    [FlagFreeUpdateAllVersion]    BIT            CONSTRAINT [DF__Variable__FlagFr__05EEBAAE] DEFAULT ((0)) NOT NULL,
    [FlagFreeUpdateLatestVersion] BIT            CONSTRAINT [DF__Variable__FlagFr__06E2DEE7] DEFAULT ((0)) NOT NULL,
    CONSTRAINT [PK_Variable] PRIMARY KEY CLUSTERED ([VariableID] ASC)
);

CREATE TABLE [dbo].[VariableValue] (
    [VariableID]      INT            NOT NULL,
    [DocumentID]      INT            NOT NULL,
    [ProjectID]       INT            NOT NULL,
    [RevisionNo]      INT            NOT NULL,
    [ConfigurationID] INT            NOT NULL,
    [ValueText]       NVARCHAR (MAX) CONSTRAINT [DF_VariableValue_ValueText] DEFAULT (N'') NOT NULL,
    [ValueInt]        INT            NULL,
    [ValueFloat]      FLOAT (53)     NULL,
    [ValueDate]       DATETIME       NULL,
    [ValueCache]      NVARCHAR (64)  CONSTRAINT [DF_VariableValue_ValueCache] DEFAULT ('') NOT NULL,
    [IsLongText]      BIT            CONSTRAINT [DF_VariableValue_IsLongText] DEFAULT ((0)) NOT NULL,
    CONSTRAINT [PK_VariableValue] PRIMARY KEY CLUSTERED ([VariableID] ASC, [DocumentID] ASC, [ProjectID] ASC, [RevisionNo] ASC, [ConfigurationID] ASC) WITH (FILLFACTOR = 80),
    CONSTRAINT [FK_VariableValue_DocumentConfiguration] FOREIGN KEY ([ConfigurationID]) REFERENCES [dbo].[DocumentConfiguration] ([ConfigurationID]),
    CONSTRAINT [FK_VariableValue_Documents] FOREIGN KEY ([DocumentID]) REFERENCES [dbo].[Documents] ([DocumentID]),
    CONSTRAINT [FK_VariableValue_Projects] FOREIGN KEY ([ProjectID]) REFERENCES [dbo].[Projects] ([ProjectID]),
    CONSTRAINT [FK_VariableValue_Variable] FOREIGN KEY ([VariableID]) REFERENCES [dbo].[Variable] ([VariableID])
);


GO
CREATE NONCLUSTERED INDEX [IX_VariableValue_DocumentID]
ON [dbo].[VariableValue]([DocumentID] ASC) WITH (FILLFACTOR = 80);

Hallo,

das war nur die halbe Antwort. :slight_smile:
Tabellen- und Spaltennamen sehe ich nun, auch wenn mir nicht die komplette Syntax bekannt ist (was ist das denn für eine Datenbank??) Ich habe nach fillfactor und nvarchar gegoogelt, weil die mir gänzlich unbekannt waren, vermutlich ist es ein Microsoft SQL-Server?

Unklar ist mir immer noch:

Ist das richtig, dass in der Spalte Variablenname sowohl „Artikelnummer“ als auch „Verschleissteil“ stehen kann?

Denn du hast geschrieben

aber Artikelnummer und Verschleissteil sind gar keine Spalten.

Gruß
Christa

Hi!

Grundsätzlich sollte man so wenige Abfragen wie möglich machen, da das die Datenbank belastet. Und das LIKE nutzt man, wenn man nicht den vollen Feldinhalt kennt, sondern nur einen Teil. Da du aber keine Platzhalter nutzt, also Gleichheit verlangst, ist das = dann auch schneller.

Ohne völlig verstanden zu haben, was du da machst:

SELECT DISTINCT 
    A.[ValueText] AS 'Artikelnummer', 
    A.[DocumentID] AS 'DokumentId aus A', 
    V.[DocumentID] AS 'DokumentId aus V',
    1 as 'Verschleissteil' 
FROM [dbo].[Variable]
INNER JOIN [dbo].[VariableValue] as A
    ON ([dbo].[Variable].[VariableID] = A.[VariableID] 
    AND A.[VariableName] = 'Artikelnummer')
INNER JOIN [dbo].[VariableValue] as V
    ON ([dbo].[Variable].[VariableID] = V.[VariableID] 
    AND V.[VariableName] = 'Verschleissteil' 
    AND V.[ValueCache] = 1)

Anmerkungen:

  • Du willst eh nur Artikel, die Verschleißteile sind. Was soll das dann mit der Spalte ‚Verschleissteil‘? Ich hab einfach mal 1 rein gesetzt.
  • Die DocumentId… Ist die für Zeilen mit gleicher VariableId auch immer gleich? Ich hab mal zwei Spalten gemacht…
  • Das mit dem ValueCache mußt du wissen, was das ist…
  • Ich hab das jetzt aus dem Kopf geschrieben, Bugs sind daher möglich.

Hallo,
danke für die Antworten…

In der Tabelle ‚VariableValue‘ sind alle Variablen aus einem PDM gespeichert.
Diese sind je ‚DocumentID‘, ‚ConfigurationsID‘, ‚RevisionsNo‘ unterschiedlich.

Ich möchte den Variablenwert (ValueCache = Variablenwert, egal welcher Typ :slight_smile: ) für eine bestimmte Artikelnummer einer Variablen der letzten Revision auslesen.

So geht es…
Hier habe ich einzelne SELECT in variablen gespeichert und verwende diese weiter.
Sollte man das optimieren oder ist es egal ob ich mehrere SELECT habe?

declare @artNr varchar(30);
declare @varName varchar(30);
declare @varID_ArtNr int;
declare @varID_Var int;
declare @docID int;
declare @confID int;
declare @RevID int;

select @artNr = 'B200200'; /* Artikelnummer, die gesucht wird */
select @varName = 'Bezeichnung1'; /* Rückgabevariablenname */

/* Variablen ID für Artikelnummer suchen */
select @varID_ArtNr = (select 
		VariableID
	from 
		Variable
	where 
		Variablename like 'Artikelnummer')

/* Variablen ID für Rückgabevariablename suchen */
select @varID_Var = (select 
		VariableID
	from 
		Variable
	where 
		Variablename like @VarName)

/* Document ID für Artikelnummer suchen */
select @docID = (select
	DocumentID
from
	VariableValue
where
	VariableID = @varID_ArtNr 
and
	ValueCache = @artNr 
group by DocumentID 
)

/* Configuration ID für Artikelnummer suchen */
select @confID = (select
	ConfigurationID 
from
	VariableValue
where
	VariableID = @varID_ArtNr 
and
	ValueCache = @artNr 
and 
	ConfigurationID >=3
)

/* grösste Revision ID für Rückgabevariable suchen */
select @RevID = (select
	MAX(RevisionNo)
from
	VariableValue
where
	DocumentID = @docID
and
	ConfigurationID = @confID 
and
	VariableID = @varID_Var 
)

/* Variablenwert  suchen und zurückgeben*/
select
	ValueCache  
from
	VariableValue 
where
	DocumentID = @docID
and
	ConfigurationID = @confID 
and
	VariableID = @varID_Var 
and 
	RevisionNo = @RevID